3
好吧,所以我正在研究Smalltalk中的一个学校任务,其基本要点是我正在编写3个“手动”设置的类并覆盖方法。 MyObject类被包装在另一个类,ManualTracer中,该类继承自ObjectTracer。如何确定方法是否在Smalltalk中的对象的祖先类中定义
MyObject包含一个类变量,manualSet,它是一组符号,指定手动为其分配哪些方法,即覆盖继承。这设置它使用类方法manualSet声明:它接受一组符号。我的问题是,我需要这个manualSet滤除它接收基于以下标准集:
- 未继承链(作为一个非手动方法,直至并包括MyObject来)。
- 实际上不是手动方法。
- 一个实际的手工方法,但父(包括祖先)类已经具有该方法(或者通过具体继承它,或者通过overidding它)(通过方法isManual选中)。
手册方法是通过包含在源code.So远我的代码看起来像这样的评论“@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”。任何帮助将非常感谢,谢谢你!
哦,UKO,什么会我离不开你。你总是回答我所有的问题。谢谢! – 2013-05-08 21:46:45
噢,我最终还是改变了这一行,并且:(selfrespondsTo:each)和:(自我canUnderstand:each),因为canUnderstand是respondsTo的类同义词:但它通过继承类来访问所有的祖先...你的看法是好主意还是坏主意? – 2013-05-08 21:49:17
@WesField没问题。 'respondsTo:aSymbol'的实现是:'^ self class canUnderstand:aSymbol' – Uko 2013-05-08 22:11:18