方法检查Squeak / Smalltalk

时间:2011-04-30 12:28:45

标签: smalltalk squeak

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

我想问一下检查方法是否为抽象方法的方式是什么? 我想写的意思, 获取符号的方法,并检查是否存在此类符号 对象中具有此类类型的方法列表,如果找到则返回true(如果不是)。 如何检查方法是否为抽象方法?

提前致谢。

3 个答案:

答案 0 :(得分: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]]

答案 1 :(得分:1)

您可以使用

  

(aClass>> aMethod)isAbstract

但它只有在aClass实际包含方法aMethod时才有效,并且不适用于超类。

所以你必须递归地检查它,类似于canderstand:如何工作。

答案 2 :(得分:0)

虽然我不知道你的最终目标是什么,Pharo代码评论家将确定未定义子类责任的方法。这可能已经是你想要做的了。另一方面,还需要检查该测试是如何实现的,以确定您是否可以使用部分或全部现有代码。