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