方法检查Squeak/Smalltalk

3
我正在尝试进行一些方法检查(在Squeak - Smalltalk中)。
我想问的是,有什么方法可以检查一个方法是否是抽象方法? 也就是说,我想写一个方法,它会接收一个类和一个符号,并检查该类类型的对象的方法列表中是否有这样的符号,如果找到,则返回真(否则为假)。 如何检查一个方法是否是抽象方法?
提前感谢。
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]]

谢谢,我有一个问题。你实际上是获取所有抽象方法的数组,然后检查它们是否属于aClass并具有aSelector吗?难道没有更简单的方法,只需遍历aClass中具有aSelector的所有方法,并检查它们是否发送#subclassResponsibility,而不是遍历所有方法,而不仅仅是aClass中的方法吗?(除非我当然弄错了) - user550413
2
尝试使用 compiledMethod containsLiteral: #subclassResponsibility - mathk
@mathk 这基本上就是 #isAbstract 的功能。我的方法更加昂贵,因为它会找到所有的抽象方法。 - Frank Shearar
1
@mathk 谢谢,我使用了 hasLiteral。此外,我发现 (on Class) 的 whichSelectorsReferTo: 非常有用。 - user550413

1

你可以使用

(aClass>>aMethod) isAbstract

但是它只适用于aClass实际包含方法aMethod的情况,对于超类无效。

因此,你需要递归地检查它,类似于canUnderstand:的工作方式。


0

虽然我不知道你的最终目标是什么,但Pharo代码批评家将识别未定义子类责任的方法。这可能已经是你想要做的事情了。另一方面,值得检查该测试的实现方式,看看是否可以使用部分或全部现有代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接