メソッド インスペクションを実行しようとしています(Squeak - Smalltalk で)。
メソッドが抽象メソッドかどうかを確認する方法は何ですか? つまり、クラスとシンボルを取得し、このクラスタイプのオブジェクトのメソッドのリストにそのようなシンボルがあるかどうかをチェックし、見つかった場合は抽象の場合は true を返します (そうでない場合)。 . メソッドが抽象メソッドかどうかを確認するにはどうすればよいですか?
前もって感謝します。
次のようになっている場合、メソッドは抽象的です(JavaまたはC ++の人々が意味する意味で)。
myMethod
self subclassResponsibility.
だから、「抽象的な」と答えるためにあなたがする必要があるのはすべてMyObject>>#myMethod
ですか?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]]
使用できます
(aClass >> aMethod)isAbstract
ただし、aClassに実際にメソッドaMethodが含まれている場合にのみ機能し、スーパークラスでは機能しません。
したがって、canUnderstand:の動作と同様に、再帰的にチェックする必要があります。
最終的な目標が何かはわかりませんが、Pharo コードの批評家は、サブクラスの責任が定義されていないメソッドを特定します。これは、すでにやりたいことかもしれません。一方で、そのテストがどのように実装されているかをチェックして、既存のコードの一部またはすべてを使用できるかどうかを確認することも価値があります。