2011-04-30 8 views
3

메서드 검사 (스퀵 - 스몰 토크에서)을 시도하고 있습니다.방법 검사 누출/스몰 토크

은 메소드가 추상 메소드인지 확인하는 방법은 무엇입니까? 의미 내가 쓰고 싶은, 는 클래스기호를 얻을 수 및 상징이 클래스 타입 인 객체의 메소드 목록이 에가 있는지 확인하고 발견하는 경우 방법은 반환합니다 abstract 인 경우는 true, 그렇지 않은 경우는 true 메서드가 추상 메서드인지 여부를 어떻게 확인할 수 있습니까?

미리 감사드립니다. 그것은 다음과 같습니다 경우

답변

4

방법은 (의미에서 Java 또는 C++ 사람을 의미) 추상적이다 : "MyObject>>#myMethod 추상적이다"

myMethod 
    self subclassResponsibility. 

그래서 당신이 대답 할 필요가 "MyObject>>#myMethod#subclassResponsibility의 발신자입니까?"

isMethodAbstract: aSelector on: aClass 
    ^(self systemNavigation allCallsOn: #subclassResponsibility) 
     anySatisfy: [:each | each selector == aSelector 
      and: [each classSymbol == aClass name]] 

을하거나 작업 공간이 평가 (#samplesPerFrame에 적합한 교체와 함께 물론 SoundCodec) :

이 방법을 추가하여 질문 오브젝트 것을 대답 할 수

(SystemNavigation default allCallsOn: #subclassResponsibility) 
    anySatisfy: [:each | each selector == #samplesPerFrame 
     and: [each classSymbol == SoundCodec name]] 
+0

감사합니다. 질문이 있습니다. 실제로 모든 추상 메소드의 배열을 가져 와서 클래스에 속해 있는지, 그리고 aSelector를 가지고 있는지 검사하고 있습니까? aClass에서 aSelector를 사용하여 모든 메서드를 살펴보고 aClass의 메서드뿐 아니라 모든 메서드를 처리하지 않고 #subclassResponsibility를 보내는 지 확인하는 간단한 방법이 있습니까? – user550413

+1

'compiledMethod containsLiteral와 시도 (내가 물론 잘못 모두 가지고하지 않는 한) : # 거의 #isAbstract가하는 일입니다 – mathk

+0

@mathk을 subclassResponsibility'. Mine은 모든 추상적 인 메소드를 찾았으므로 더 비쌉니다. –

1

사용할 수 있습니다

(aClass >> aMethod) isAbstract

그러나 aClass가 실제로 메소드 aMethod를 포함하고 슈퍼 클래스에서는 작동하지 않는 경우에만 작동합니다.

canUnderstand :와 유사하게 재귀 적으로 확인해야합니다.

+0

'CompiledMethod >> # isAbstract'은 (는) 까다 롭습니다! –

0

궁극적 인 목표가 무엇인지 모르겠지만 Pharo 코드 비평가는 하위 클래스 책임이 정의되지 않은 메소드를 식별합니다. 이것은 이미 당신이하고 싶은 일일 것입니다. 다른 한편, 기존 코드의 일부 또는 전부를 사용할 수 있는지 여부를 확인하기 위해 테스트가 구현되는 방법을 확인해 보는 것도 가치가 있습니다.