【问题标题】:Is it possible to implement an abstract method that is not pure virtual in Pharo Smalltalk?是否可以在 Pharo Smalltalk 中实现非纯虚拟的抽象方法?
【发布时间】:2014-08-17 03:48:21
【问题描述】:

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

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

【问题讨论】:

    标签: inheritance methods smalltalk pharo


    【解决方案1】:

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

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

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

    store: 的位置有 subclassResponsibility

    【讨论】:

    • 是的,我知道抽象和虚拟术语不适用于 Smalltalk,但我认为使用它们来解释自己会更容易,因为我不知道 Smalltalk 中使用了哪些术语,因为它们众所周知......但是,你明白了。 :)
    【解决方案2】:

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

    你要解决的问题需要这样解决:

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

    很简单:)

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

    【讨论】:

    • 是的,这也是其他面向对象语言的方式......我只是想知道这在 Smalltalk 中是否可行。也许这很愚蠢,但我突然想到了:)
    • @VitorCruz 好吧……Smalltalk 超级灵活,而且现在pharo 有 Opal 编译器,所以你可以尝试引入类似的东西,看看它是否有效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 2020-11-28
    • 2020-04-27
    • 1970-01-01
    相关资源
    最近更新 更多