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

Inheritance 有可能在Pharo Smalltalk中实现一个非纯虚拟的抽象方法吗?,inheritance,methods,smalltalk,pharo,Inheritance,Methods,Smalltalk,Pharo,我知道可以通过使用SubassResponsibility实现纯虚拟方法,也可以通过在具体方法中调用纯虚拟方法来实现模板方法。现在,可以创建具有默认实现的方法,但是必须由子类实现吗?如果是,如何(在Pharo上) 示例:假设我想提供集合的一个子类,该子类对#add进行一些验证,但不实现存储,因此让其子类来决定要做什么。虽然#add确实有一些实现,但完成它仍然是子类的责任。首先,在Smalltalk中没有真正的“抽象方法”。关键思想是,如果您运行该方法,它会将subassresponsibilit

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


示例:假设我想提供集合的一个子类,该子类对#add进行一些验证,但不实现存储,因此让其子类来决定要做什么。虽然#add确实有一些实现,但完成它仍然是子类的责任。

首先,在Smalltalk中没有真正的“抽象方法”。关键思想是,如果您运行该方法,它会将
subassresponsibility
发送到
self
,因此类会向您发出信号,如果您尝试运行该方法,该方法实际上是subclass的责任。当然,IDE可以发现
子责任
并将方法标记为“抽象”

所以我建议你使用模板,即

add: aThing
  (self validate: aThing)
    ifTrue: [ self store: aThing ]
    ifFalse: [ "signal error" ]

其中
存储:
具有
子责任

首先,在Smalltalk中没有真正的“抽象方法”这样的东西。关键思想是,如果您运行该方法,它会将
subassresponsibility
发送到
self
,因此类会向您发出信号,如果您尝试运行该方法,该方法实际上是subclass的责任。当然,IDE可以发现
子责任
并将方法标记为“抽象”

所以我建议你使用模板,即

add: aThing
  (self validate: aThing)
    ifTrue: [ self store: aThing ]
    ifFalse: [ "signal error" ]

其中
存储:
具有
子类责任

Smalltalk中没有虚拟方法。或者,更准确地说,所有方法都是“虚拟的”

您试图解决的问题需要通过以下方式解决:

add: anObject 
  self someValidationOf: anObject.
  self basicAdd: anObject.

basicAdd: anObject
  self subclassResponsibility.
很简单:)


老实说,我不知道你会有什么不同,不管是哪种语言(我能想到的任何OO语言都必须以同样的方式来实现)。

Smalltalk中没有虚拟方法。或者,更准确地说,所有方法都是“虚拟的”

您试图解决的问题需要通过以下方式解决:

add: anObject 
  self someValidationOf: anObject.
  self basicAdd: anObject.

basicAdd: anObject
  self subclassResponsibility.
很简单:)


老实说,我不知道你会有什么不同,不管是哪种语言(我能想到的任何OO语言都必须以同样的方式来实现)。

是的,我知道抽象和虚拟这个术语不适用于Smalltalk,但我想用它们来解释我自己会更容易,因为我不知道Smalltalk中使用了哪些术语,而且它们是众所周知的。。。但是,好吧,你知道了是的,我知道抽象和虚拟这两个术语不适用于Smalltalk,但我想用它们来解释我自己会更容易,因为我不知道Smalltalk中使用了哪些术语,而且它们是众所周知的。。。但是,好吧,你知道了是的,在其他OO语言中也是这样。。。我只是想知道这在Smalltalk中是否可行。也许这很傻,但我突然想到:)@VitorCruz嗯……Smalltalk非常灵活,现在pharo有了Opal编译器,所以你可以尝试介绍类似的东西,看看它是否有效是的,在其他OO语言中也是如此。。。我只是想知道这在Smalltalk中是否可行。也许这很傻,但我突然想到:)@VitorCruz嗯……Smalltalk非常灵活,现在pharo有了蛋白石编译器,所以你可以尝试介绍类似的东西,看看它是否有效