【发布时间】:2013-10-05 22:13:03
【问题描述】:
我希望将“经典 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 的设计者只使用接口并选择不直接支持这个经典的 OO 用例,就像我们在 Ruby、Python、Java 等中看到的那样,但我怀疑应该有一些 模拟这个的成语或最佳实践。这样做的首选方式是什么?
【问题讨论】:
标签: ruby inheritance interface go