如何确定方法是不是在 Smalltalk 中对象的祖先类中定义

Posted

技术标签:

【中文标题】如何确定方法是不是在 Smalltalk 中对象的祖先类中定义【英文标题】:How to determine if a method is defined in an ancestor class of an object in Smalltalk如何确定方法是否在 Smalltalk 中对象的祖先类中定义 【发布时间】:2013-05-08 20:43:13 【问题描述】:

好的,所以我正在 Smalltalk 中完成一项学校作业,基本上它的要点是我正在编写 3 个“手动”设置和覆盖方法的类。 MyObject 类封装在另一个类 ManualTracer 中,该类继承自 ObjectTracer。

MyObject 包含一个类变量 manualSet,它是一组符号,用于指定手动分配给它的方法,即覆盖继承。它使用类方法 manualSet: 声明的这个集合:接受一组符号。我的问题是我需要这个 manualSet 根据以下标准过滤掉它收到的集合:

    不在继承链中(作为非手动方法,直到并包括 MyObject)。 实际上不是手动方法。(通过方法isManual检查) 一个实际的手动方法,但父(包括祖先)类已经拥有该方法(通过专门继承或覆盖它)。

通过在源代码中包含注释“@Manual”来检查手动方法。到目前为止,我的代码如下所示:

manualSet: aSet
| validatedSet |
( aSet == nil ) ifTrue: [ manualSet:= nil ] 
ifFalse: [ 
    (aSet isMemberOf: Set) ifFalse:[^nil]. 
    validatedSet:= aSet select:[ :each| (each isMemberOf:Symbol)
                                    and:(self respondsTo:each)
                                    and:(self isManual:each in: self) 
                                    and:((self isManual:each in:super)not)].
    manualSet:= validatedSet.
]

所以“超级”显然不够好,我需要遍历所有祖先,而不仅仅是父级。我还需要检查所有祖先的 cmets 并确定它们是否包含“@Manual”。任何帮助将不胜感激,谢谢!

【问题讨论】:

【参考方案1】:

您可以使用allSuperclasses 方法获取所有祖先。例如:

Integer allSuperclasses

会回来

an OrderedCollection(Number Magnitude Object ProtoObject)

那你可以用allSatisfy: aBlock看看他们有没有这个方法。

我认为您的代码将如下所示:

manualSet: aSet
| validatedSet |
( aSet == nil ) ifTrue: [ manualSet:= nil ] 
ifFalse: [ 
    (aSet isMemberOf: Set) ifFalse:[^nil]. 
    validatedSet:= aSet select:[ :each|
        (each isMemberOf:Symbol)
        and:(self respondsTo:each)
        and:(self isManual:each in: self) 
        and:(self allSuperclasses allSatisfy: [:class |
            (self isManual:each in:class) not])].
    manualSet:= validatedSet.
]

【讨论】:

哦,宇子,没有你我该怎么办。你总是回答我所有的问题。谢谢! 哦,我最后也将 and:(self respondsTo:each) 更改为 and:(self canUnderstand:each),因为 canUnderstand 是 respondsTo: 的类侧同义词,但它访问所有祖先通过类继承......你认为是好主意还是坏主意? @WesField 没问题。 respondsTo: aSymbol的实现是:^self class canUnderstand: aSymbol

以上是关于如何确定方法是不是在 Smalltalk 中对象的祖先类中定义的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中,如何确定对象是不是可迭代?

如何确定 Javascript 对象是不是为事件?

如何确定 Apple 方法是不是是异步的?

回到未来:Smalltalk 编程系统

“类不是对象”是什么意思?

SQL:如何确定对象是不是在同一位置超过 8 小时