【发布时间】:2011-04-30 12:28:45
【问题描述】:
我正在尝试做一些方法检查(在 Squeak - Smalltalk 中)。
我想问检查一个方法是否是抽象方法的方法是什么? 意思是我想写, 获取 class 和 symbol 的方法,并检查其中是否存在这样的符号 属于此类类型的对象中的方法列表,如果找到将返回 true,如果是抽象的(否则不是)。 如何检查一个方法是否是抽象方法?
提前致谢。
【问题讨论】:
我正在尝试做一些方法检查(在 Squeak - Smalltalk 中)。
我想问检查一个方法是否是抽象方法的方法是什么? 意思是我想写, 获取 class 和 symbol 的方法,并检查其中是否存在这样的符号 属于此类类型的对象中的方法列表,如果找到将返回 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]]
【讨论】:
compiledMethod containsLiteral: #subclassResponsibility
你可以使用
(aClass>>aMethod) isAbstract
但它仅在 aClass 实际包含方法 aMethod 时才有效,并且不适用于超类。
所以你必须递归地检查它,类似于 canUnderstand: 的工作原理。
【讨论】:
虽然我不知道您的最终目标是什么,但 Pharo 代码批评者会确定未定义子类责任的方法。这可能已经是您想要做的。另一方面,也值得检查一下该测试是如何实现的,看看您是否可以使用部分或全部现有代码。
【讨论】: