2014-11-15 1 views
0

소규모 대학 프로젝트의 경우 시상식을 시뮬레이트하는 스몰 토크에서 애플리케이션을 작성해야합니다. 여기서 예술가와 밴드는 상을 받기 위해 지명 될 수 있습니다. 그러나 개인 아티스트는 후보로 투표 할 배심원 일 수도 있습니다.스몰 토크에서 런타임에 개체에 특성 추가

배심원이 아닌 아티스트에게 투표를 할 수 없도록 제한하기 위해 배심원에게 추가 된 각 아티스트의 개체에 동적으로 특성을 추가 할 생각이었습니다. 그러면 메소드 클래스를 적절하게 처리 할 수 ​​있습니다.

이제 내 질문에 개체에 특성을 동적으로 추가 할 수 있습니까? 나는 이미 How can I add methods to a class at runtime in Smalltalk?을 보았지만 내가 찾고있는 것이 아니다.

안부

UPDATE 1 를 클래스 쪽의 방법을 추가 한 후,이 작동한다. 내가 배심원에 예술가를 할당 할 때, 내가 좋아하는 뭔가를 쓰기 : 나는 목록에 (투표) 아티스트를 추가 juryMemberOf 방법에있어서 다음

kurt_cobain juryMemberOf: aJury. 

을 (배심원은 그가 모든 추적하기 회원 :

juryList add: (VotingArtist from: self) 

다음 juryList를 검사하면 참으로 목록에 VotingArtist 개체가 추가 된 것을 볼 수 있습니다. 그러나 내 작업 영역의 원본 아티스트 개체는 VotingArtist로 변경되지 않았습니다.

kurt_cobain votesFor: justin_bieber. 

이 시점에서 시간에 내가 kurt_cobain 여전히 아티스트 객체이기 때문에 정상적인 방법 votesFor에 대한 MessageNotUnderstood 얻을 : 이것이 내가 쓸 수있는 능력을 가질 필요가 이후에 가능하지만 확실하지.

답변

2

그건 매우 해킹입니다. 문제는 고전적인 상속을 사용하여 해결할 수 있습니다. 숙제이므로 여기서는 자세히 설명하지 않겠습니다. 투표권을 가진 아티스트는 단순히 서브 클래스 또는 Artist입니다. 아티스트에게 투표권을 부여하려면 수업을 변경하십시오 (예 : VotingArtist from: self, 여기서 VotingArtistArtist의 하위 클래스입니다. #from:은 (는)

으로 구현 될 수 있습니다.
VotingArtist class>>from: anArtist 
    ^self new copyFrom: anArtist 
+0

알겠습니다. 상속은 내가 ​​생각한 가능성 중 하나 였지만 스몰 토크에 대한 지식은 매우 제한되어 있으며 하위 유형의 객체에 객체를 복사 할 가능성을 알지 못했습니다. 감사! – RazorAlliance192

+0

당신이 제공 한 코드를 실행할 때 messageNotUnderst를 받았습니다 ... VotingArtist는 아티스트의 하위 클래스이지만 아직이 오류가 발생합니다. – RazorAlliance192

+0

어떤 오류가 있습니까? –

1

개체에 동작을 추가하는 것과 관련하여 문제에 대해 생각하지 마십시오. 당신이 그 행동을 어떻게 사용할 것인지에 관해서 생각해보십시오. 코드의 어느 시점에서

, 당신은 어떻게 kurt_cobain이 투표 할 수있는 대상임을 알게 될 것입니다,이 때

kurt_cobain votesFor: justin_beiber "How is this even possible?" 

말을해야합니까? 이것이 사실인지 여부를 먼저 테스트해야합니까?

kurt_cobain canVote ifTrue: [kurt_cobain votesFor: justin_beiber] 

이 작업을 모든 곳에서 수행하는 경우 효과적으로 모든 클래스 테스트를 수행하고 있습니다. 클래스 테스트는 누락 된 객체의 코드 냄새입니다.

대신 VotingArtist를 사용하는 것이 좋습니다. VotingArtist를 사용할 때마다 투표 할 수있는 사람에 대해 이야기하고 있음을 알 수 있습니다. 수업을 테스트 할 필요가 없습니다. 투표 예술가는 아티스트를 참조하고 투표 예술가가 지명했거나 투표 한 사람을 추적 할 수 있습니다.아마도이 이벤트에는 아티스트 컬렉션과 VotingArtists 컬렉션이 있습니다. 아티스트에게 투표를 요청하지 않으며 투표 예술가에게 수행을 요청하지 않아야합니다. 그러나 투표 아티스트는 아티스트를 참조 할 수 있습니다.

이제 투표자가 아티스트와 동일한 메시지에 응답해야합니까? 아티스트를 사용할 것으로 예상되는 상황에서 투표 아티스트를 사용 하시겠습니까? 여기서의 대답은 '아니오'일 수 있습니다. 투표 예술가가 투표하고 지명합니다. 아티스트가 음악을 연주합니다. 음악을 연주하는 것과 관련된 메시지를 보내려는 경우 VotingArtist가 있다는 것을 알고있는 맥락에서 볼 수 있습니다. VotingArtist에게 아티스트를 요청하고 연주하는 음악 동작에 사용하십시오. VotingArtist와 아티스트간에 동작이 중복되지 않아 하위 클래스 관계가 아닐 수도 있습니다. 둘 다 서로 바꿔서 사용할 수 없다면 둘 사이에 계층 적 관계가 필요하지 않습니다.

+0

내 응용 프로그램의 시작 부분에 몇 가지 아티스트 개체를 생성합니다. 현재 어떤위원회가 배심원 중 한 명 (즉, 투표/지명 가능)인지 알 수 없습니다. 그렇다면이 시점에서'kurt_cobain juryMemberOf : aJury'라고 말하면 나는 그가 투표 예술가임을 확신합니다. 이 문장은 '투표 아티스트에게 아티스트를 요청하고 공연 음악 활동에 사용합니다.' 당신은 어떤 종류의 대의원을 사용하여 참조합니까? – RazorAlliance192

+0

나는 그것을 뒤집을 것이다. 저는 주디에게 addMember : kurt_cobain라고 물어볼 것입니다. 그러면 kurt_cobain을 참조하는 인스턴스 변수가 포함 된 VotingArtist의 인스턴스가 만들어지고이 VoringArtist가 Jury에 추가됩니다. –