Smalltalk 方法检查吱吱声/说话声

Smalltalk 方法检查吱吱声/说话声,smalltalk,squeak,Smalltalk,Squeak,我正在尝试做一些方法检查(在Squeak-Smalltalk中) 我想问一下,检查方法是否为抽象方法的方法是什么? 意思是我想写, 一种获取类和符号的方法,该方法将检查 此类类型的对象中的方法列表(如果找到)将在抽象时返回true(否则不返回)。 如何检查方法是否为抽象方法? > P> >方法是抽象的(在java或C++中,意思是),如果是这样的: myMethod self subclassResponsibility. 因此,要回答“是MyObject>#myMethodabstra

我正在尝试做一些方法检查(在Squeak-Smalltalk中)

我想问一下,检查方法是否为抽象方法的方法是什么? 意思是我想写, 一种获取符号的方法,该方法将检查 此类类型的对象中的方法列表(如果找到)将在抽象时返回true(否则不返回)。 如何检查方法是否为抽象方法?

> 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]]