好的,所以我正在用 Smalltalk 做一项学校作业,基本上它的要点是我正在编写 3 个“手动”设置和覆盖方法的类。类 MyObject 包装在另一个类 ManualTracer 中,该类继承自 ObjectTracer。
MyObject 包含一个类变量 manualSet,它是一组符号,指定手动分配给它的方法,即覆盖继承。该集合使用类方法 manualSet: 声明,它接受一组符号。我的问题是我需要这个 manualSet 来根据以下标准过滤掉它收到的集合:
通过在源代码中包含注释“@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/