2017-12-20 3 views
2

내가 다른 객체 메소드 사전 런타임 동안에 자기 방법 사전에서 메소드를 추가했지만, 난 성공하지 않았다, 나는하려고 노력하고 방법 사전에서 메서드를 anothor에 올바른 방법으로 추가 할 수 있습니까?

+2

"하지만 성공하지 못했습니다.".... 정확히 무엇이 잘못 되었나요? 에러 메시지? 잘못된 결과? 어떤 상황에서 이것을 부르시고 있습니까? 인스턴스 메소드에 있습니까? 클래스 메서드? 또한 오류가 있습니다. 'methodDic' 셀렉터는 없습니다. – lurker

+0

오류 메시지 => "오류 : primSize : 실패". 그의 클래스 메서드에 인스턴스 메소드를 추가하려고 시도했습니다 .Dictionary – haitham

+0

이것을 호출하는 컨텍스트가 무엇입니까? '자기'란 무엇을 말하는거야? – lurker

답변

0

이것은 실제로 모든 것이 스몰 토크에서 객체라는 것을 배우기위한 위대한 훈련입니다 :) methodDictionary의 메소드는 단순히 여러 가지 방법으로 사용될 수있는 CompiledMethods의 인스턴스입니다. 즉, 런타임시 클래스 조작, 반사 방식 프로그램 작성.

질문에 대한 귀하의 코드에 약간의 오류가 있습니다. methodDict를 사용하는 대신 methodDictionary 접근자를 사용하면 잘 작동합니다. methodDict에 직접 액세스하면 안됩니다.

다음은 pharo 이미지에서 실행할 수있는 작은 놀이터입니다. ClassA와 B를 각각의 것으로 교체하십시오. 그 후에 복사 된 메소드는 계속 유지되고 ClassB를 탐색 할 때 계속 표시됩니다.

"list methods of ClassA and ClassB" 
Transcript open; clear. 
Transcript show: '**ClassA methodDictionary:', String crlf. 
ClassA methodDictionary associationsDo: 
    [:assoc | Transcript show: assoc value asString, String crlf]. 
Transcript show: '**ClassB methodDictionary (Before):', String crlf. 
ClassB methodDictionary associationsDo: 
    [:assoc | Transcript show: assoc value asString, String crlf]. 

"Transfer all methods of ClassA to ClassB" 
ClassA methodDictionary associationsDo: 
    [:assoc | ClassB methodDictionary at: assoc key put: assoc value]. 

"again .. list methods of ClassB" 
Transcript show: '**ClassB methodDictionary (After):', String crlf. 
ClassB methodDictionary associationsDo: 
    [:assoc | Transcript show: assoc value asString, String crlf].