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

Inheritance 如何确定方法是否在Smalltalk中对象的祖先类中定义,inheritance,parent,smalltalk,squeak,ancestor,Inheritance,Parent,Smalltalk,Squeak,Ancestor,好的,我正在用Smalltalk做一个学校作业,基本上它的要点是我正在写3个类,这些类“手动”设置并覆盖方法。MyObject类包装在另一个类ManualTracer中,该类继承自ObjectTracer MyObject包含一个类变量manualSet,它是一组符号,指定手动分配给它的方法,即重写继承。该集合是使用类方法manualSet:声明的,它接受一组符号。我的问题是,我需要此手册集根据以下标准过滤掉它接收到的集: 不在继承链中(作为非手动方法,直到并包括MyObject) 实际上不是手

好的,我正在用Smalltalk做一个学校作业,基本上它的要点是我正在写3个类,这些类“手动”设置并覆盖方法。MyObject类包装在另一个类ManualTracer中,该类继承自ObjectTracer

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

  • 不在继承链中(作为非手动方法,直到并包括MyObject)
  • 实际上不是手动方法。(通过手动方法检查)
  • 一个实际的手动方法,但父类(包括祖先类)已经有了该方法(或者通过专门继承它,或者通过重写它)
  • 通过在源代码中包含注释“@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.
    ]
    

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

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

    Integer allSuperclasses
    
    会回来的

    an OrderedCollection(Number Magnitude Object ProtoObject)
    
    然后您可以使用
    allsuccess: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.
    ]
    

    哦,Uko,没有你我怎么办。你总是回答我所有的问题。谢谢哦,最后我把行和:(self respondsTo:each)改为和:(self canunder:each),因为canunder是respondsTo的类端同义词,但它通过类继承访问所有祖先。。。你认为是好主意还是坏主意?@WesField没问题。
    respondsTo:aSymbol
    的实现是:
    ^self类可以理解:aSymbol