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