我正在尝试进行一些方法检查(在 Squeak - Smalltalk 中)。
我想问一下检查方法是否是抽象方法的方法是什么?意思是我想写一个方法,它获取一个类和一个符号,并将检查此类类型的对象的方法列表中是否存在这样的符号,如果找到,则返回 true 如果是抽象的(否则不是) . 如何检查方法是否是抽象方法?
提前致谢。
一个方法是抽象的(在 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]]
或者只是在工作区中评估它(当然还有合适的替代品#samplesPerFrame
)SoundCodec
:
(SystemNavigation default allCallsOn: #subclassResponsibility)
anySatisfy: [:each | each selector == #samplesPerFrame
and: [each classSymbol == SoundCodec name]]
您可以使用
(aClass>>aMethod) isAbstract
但它仅在 aClass 实际包含方法 aMethod 时才有效,并且不适用于超类。
所以你必须递归地检查它,类似于 canUnderstand: 的工作方式。
虽然我不知道您的最终目标是什么,但 Pharo 代码批评者将识别未定义子类责任的方法。这可能已经是您想要做的。另一方面,也值得检查该测试是如何实现的,看看您是否可以使用部分或全部现有代码。