是否有可能在Pharo Smalltalk中实现一个非纯虚拟的抽象方法?

时间:2014-08-17 03:48:22

标签: inheritance methods smalltalk pharo

我知道可以通过在具体的方法中调用纯虚方法,使用subclassResponsibility或模板方法来实现纯虚方法。现在,可以使用默认实现创建一个方法,但必须由子类实现?如果是,如何(在Pharo上)?

示例:假设我想提供一个Collection的子类,它在#add上做了一些验证但是没有实现存储,因此留给它的子类来决定做什么。虽然#add确实有一些实现,但它仍然是完成它的子类责任。

2 个答案:

答案 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语言都必须以同样的方式做到这一点)。