Smalltalk 方法检查吱吱声/说话声
我正在尝试做一些方法检查(在Squeak-Smalltalk中) 我想问一下,检查方法是否为抽象方法的方法是什么? 意思是我想写, 一种获取类和符号的方法,该方法将检查 此类类型的对象中的方法列表(如果找到)将在抽象时返回true(否则不返回)。 如何检查方法是否为抽象方法?Smalltalk 方法检查吱吱声/说话声,smalltalk,squeak,Smalltalk,Squeak,我正在尝试做一些方法检查(在Squeak-Smalltalk中) 我想问一下,检查方法是否为抽象方法的方法是什么? 意思是我想写, 一种获取类和符号的方法,该方法将检查 此类类型的对象中的方法列表(如果找到)将在抽象时返回true(否则不返回)。 如何检查方法是否为抽象方法? > P> >方法是抽象的(在java或C++中,意思是),如果是这样的: myMethod self subclassResponsibility. 因此,要回答“是MyObject>#myMethodabstra
> P> >方法是抽象的(在java或C++中,意思是),如果是这样的:
myMethod
self subclassResponsibility.
因此,要回答“是MyObject>#myMethod
abstract?”所需要做的就是回答“是MyObject>#myMethod
一个#subassresponsibility
的发送者?”
您可以通过将此方法添加到对象来回答该问题:
isMethodAbstract: aSelector on: aClass
^ (self systemNavigation allCallsOn: #subclassResponsibility)
anySatisfy: [:each | each selector == aSelector
and: [each classSymbol == aClass name]]
或者简单地在工作区中对此进行评估(当然可以使用#samplesPerFrame
和SoundCodec
的合适替代品):
你可以用
(类别>>方法)Isastract
但它只在aClass实际包含方法aMethod时有效,而不适用于超类
因此,您必须递归地检查它,类似于canUnderstand:如何工作。虽然我不知道您的最终目标是什么,但Pharo代码评论家将确定未定义子类责任的方法。这可能已经是你想要做的了。另一方面,还值得检查该测试是如何实现的,以查看是否可以使用部分或全部现有代码。谢谢,我有一个问题。您是否实际获取了所有抽象方法的数组,然后检查它们是否属于aClass并具有一个选择器?有没有更简单的方法,只使用aClass中的selector检查所有方法,并检查它们是否发送#subassresponsibility,而不是只检查aClass中的所有方法?(当然,除非我完全弄错了)尝试使用
compiledMethodcontainsTerral:#subassResponsibility
@mathk,这正是Isastract所做的。当然,我的更贵,因为它能找到所有抽象方法。@mathk谢谢,我用的是hasLiteral。此外,我发现选民所指的(在课堂上)非常有用。
(SystemNavigation default allCallsOn: #subclassResponsibility)
anySatisfy: [:each | each selector == #samplesPerFrame
and: [each classSymbol == SoundCodec name]]