3

メソッド インスペクションを実行しようとしています(Squeak - Smalltalk で)。

メソッドが抽象メソッドかどうかを確認する方法は何ですか? つまり、クラスシンボルを取得し、このクラスタイプのオブジェクトのメソッドのリストにそのようなシンボルがあるかどうかをチェックし、見つかった場合は抽象の場合は true を返します (そうでない場合)。 . メソッドが抽象メソッドかどうかを確認するにはどうすればよいですか?

前もって感謝します。

4

3 に答える 3

4

次のようになっている場合、メソッドは抽象的です(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]]

または、ワークスペースでこれを評価するだけです(もちろん、適切な代替品を使用して#samplesPerFrameSoundCodec

(SystemNavigation default allCallsOn: #subclassResponsibility)
    anySatisfy: [:each | each selector == #samplesPerFrame
        and: [each classSymbol == SoundCodec name]]
于 2011-04-30T15:17:50.847 に答える
1

使用できます

(aClass >> aMethod)isAbstract

ただし、aClassに実際にメソッドaMethodが含まれている場合にのみ機能し、スーパークラスでは機能しません。

したがって、canUnderstand:の動作と同様に、再帰的にチェックする必要があります。

于 2011-04-30T17:57:42.857 に答える
0

最終的な目標が何かはわかりませんが、Pharo コードの批評家は、サブクラスの責任が定義されていないメソッドを特定します。これは、すでにやりたいことかもしれません。一方で、そのテストがどのように実装されているかをチェックして、既存のコードの一部またはすべてを使用できるかどうかを確認することも価値があります。

于 2011-05-02T16:54:54.500 に答える