inheritance - 如何确定一个方法是否定义在 Smalltalk 对象的祖先类中

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

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

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

通过在源代码中包含注释“@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.
]

所以“ super ”显然不够好,我需要遍历所有祖先,而不仅仅是父代。我还需要查看所有祖先的评论并确定它们是否包含“@Manual”。非常感谢任何帮助,谢谢!

最佳答案

您可以使用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.
]

https://stackoverflow.com/questions/16449839/

相关文章:

scala - 由于递归隐式(上下文绑定(bind)问题?),spray-json 中的 NPE

django - 如何修复 Django 错误 : "' unicode' object has n

cassandra - Cassandra 是否是一个很好的候选数据库,因为它必须每秒支持超过 10

r - 哪些参数被传递给回溯中的函数?

vbscript - 使用 VBScript 获取 Mac 地址

eclipse - 无法使用 sass-maven-plugin 编译 style.scss

sql - 按连接表数据排序的复杂 SQL 查询

sql-server - 在 edmx 中重命名列的最佳方法是什么?

r - R中代数关系的笛卡尔积表

ember.js - Emberjs 将对象添加到 ArrayController,服务器查询是不可