2013-05-08 21 views
3

好吧,所以我正在研究Smalltalk中的一个学校任务,其基本要点是我正在编写3个“手动”设置的类并覆盖方法。 MyObject类被包装在另一个类,ManualTracer中,该类继承自ObjectTracer。如何确定方法是否在Smalltalk中的对象的祖先类中定义

MyObject包含一个类变量,manualSet,它是一组符号,指定手动为其分配哪些方法,即覆盖继承。这设置它使用类方法manualSet声明:它接受一组符号。我的问题是,我需要这个manualSet滤除它接收基于以下标准集:

  1. 未继承链(作为一个非手动方法,直至并包括MyObject来)。
  2. 实际上不是手动方法。
  3. 一个实际的手工方法,但父(包括祖先)类已经具有该方法(或者通过具体继承它,或者通过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”。任何帮助将非常感谢,谢谢你!

回答

5

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

哦,UKO,什么会我离不开你。你总是回答我所有的问题。谢谢! – 2013-05-08 21:46:45

+0

噢,我最终还是改变了这一行,并且:(selfrespondsTo:each)和:(自我canUnderstand:each),因为canUnderstand是respondsTo的类同义词:但它通过继承类来访问所有的祖先...你的看法是好主意还是坏主意? – 2013-05-08 21:49:17

+1

@WesField没问题。 'respondsTo:aSymbol'的实现是:'^ self class canUnderstand:aSymbol' – Uko 2013-05-08 22:11:18

相关问题