我知道可以通过在具体的方法中调用纯虚方法,使用subclassResponsibility或模板方法来实现纯虚方法。现在,可以使用默认实现创建一个方法,但必须由子类实现?如果是,如何(在Pharo上)?
示例:假设我想提供一个Collection的子类,它在#add上做了一些验证但是没有实现存储,因此留给它的子类来决定做什么。虽然#add确实有一些实现,但它仍然是完成它的子类责任。
答案 0 :(得分:6)
首先,Smalltalk中没有“抽象方法”这样的东西。关键的想法是,如果你运行该方法,它会将subclassResponsibility
发送到self
,因此该类会通知您,如果您尝试运行该方法,则此方法实际上是子类的责任。当然IDE可以发现subclassResponsibility
并将方法标记为“抽象”。
所以我建议你使用模板,即
add: aThing
(self validate: aThing)
ifTrue: [ self store: aThing ]
ifFalse: [ "signal error" ]
store:
有subclassResponsibility
答案 1 :(得分:3)
Smalltalk中没有虚拟方法。或者,更确切地说,所有方法都是虚拟的"。
您要解决的问题需要通过这种方式解决:
add: anObject
self someValidationOf: anObject.
self basicAdd: anObject.
basicAdd: anObject
self subclassResponsibility.
非常简单:)
老实说,我不知道你会如何区别对待,无论语言是什么(我能想到的任何OO语言都必须以同样的方式做到这一点)。