我正在尝试做一些方法检查(在Squeak - Smalltalk中)。
我想问一下检查方法是否为抽象方法的方式是什么? 我想写的意思, 获取类和符号的方法,并检查是否存在此类符号 对象中具有此类类型的方法列表,如果找到则返回true(如果不是)。 如何检查方法是否为抽象方法?
提前致谢。
答案 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]]
或者只是在工作区中对此进行评估(当然适当替换#samplesPerFrame
和SoundCodec
):
(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代码评论家将确定未定义子类责任的方法。这可能已经是你想要做的了。另一方面,还需要检查该测试是如何实现的,以确定您是否可以使用部分或全部现有代码。