3

我正在尝试进行一些方法检查(在 Squeak - Smalltalk 中)。

我想问一下检查方法是否是抽象方法的方法是什么?意思是我想写一个方法,它获取一个和一个符号,并将检查此类类型的对象的方法列表中是否存在这样的符号,如果找到,则返回 true 如果是抽象的(否则不是) . 如何检查方法是否是抽象方法?

提前致谢。

4

3 回答 3

4

一个方法是抽象的(在 Java 或 C++ 的意义上),如果它看起来像这样:

myMethod
  self subclassResponsibility.

所以你需要做的就是回答“是MyObject>>#myMethod抽象的?” 是回答“是MyObject>>#myMethod发件人#subclassResponsibility吗?”

您可以通过将此方法添加到 Object 来回答问题:

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 回答