在 Go 中建模“超类方法实现”的最佳方法是什么?

我希望将“经典 OO”示例翻译成 Go,其中一组子类自己实现一些方法,但它们通过它们的超类共享一些方法的实现。我很清楚如何使用 Go 的接口,我什至使用过嵌入,但我不太确定使用什么习语(如果有的话)来捕捉这种预期行为。


这是一个具体的,可能是一个非常熟悉的例子。我会用红宝石。有两种动物,狗和牛。所有的动物都有名字,它们会说话。无论动物类型如何,您设置和获取的方式都是相同的;它们发出的声音因子类而异。现在有一个speak对所有动物都相同的方法,但它委托给子类的sound方法。这是在 Ruby 中的:


class Animal

  def initialize(name); @name = name; end

  def speak; puts "#{@name} says #{sound()}"; end

end

class Dog < Animal; def sound(); "woof"; end; end

class Cow < Animal; def sound(); "mooo"; end; end

在 Go 中如何最好地捕获它?


到目前为止我已经尝试过


type Animal struct {

    name string

}


type Cow struct {

    Animal

}


type Dog struct {

    Animal

}

我已经能够像这样构建“动物”:


func (d Dog) sound() string {return "woof"}

func (c Cow) sound() string {return "mooo"}


func main() {

    d := Dog{Animal{"Sparky"}}

    c := Cow{Animal{"Bessie"}}

    fmt.Println(d.name)

    fmt.Println(c.sound())

}

但我觉得我在做这一切都是错误的。我知道我可以放入sound()一个界面,但是特定的动物是发声器,而不是真正的动物。如果Animal成为界面,我不能分享名称和发言代码。我意识到 Go 的设计者只使用接口,并选择不直接支持这个经典的面向对象用例,就像我们在 Ruby、Python、Java 等中看到的那样,但我怀疑应该有一些习惯用法或最好的模拟这个的练习。这样做的首选方法是什么?


四季花海
浏览 215回答 3
3回答

30秒到达战场

但我怀疑应该有一些成语或最佳实践来模拟这一点。不,没有。如果确实出现了这样的事情(并且在实际代码中并不经常出现,但主要是在 Java/Ruby/任何代码的翻译中):interface Named { Name() string }并interface Sounder { Sound() }结合interface Animal {Named, Sounder}并传递这些动物。再次:“首选方式”是在没有继承的情况下重塑解决方案。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go