我期待将一个“经典的OO”例子翻译成Go,其中一组子类自己实现一些方法,但它们通过它们的超类共享一些方法的实现。我非常了解如何使用Go的接口,甚至使用了嵌入,但我不太确定使用什么成语来捕获这种预期的行为。在Go中建立“超类方法实现”的最佳方式是什么?
下面是一个具体的,也许是一个非常熟悉的例子。我将使用Ruby。有两种动物,狗和牛。所有动物都有名字,他们可以说话。不管动物的类型如何,您设置和获得相同的方式都是一样的;他们发出的声音因子类而异。现在有一个speak
方法,它对所有的动物都是相同的,但它委托给子类的sound
方法。这里是红宝石:
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等中看到它,但我怀疑应该有一些成语或模拟此最佳做法。这样做的首选方式是什么?
很好的回答和+1给了相关的罗勃·派克报价。我知道我们并没有在Go中提到我正在问的确切类型的事情(实现继承),但似乎仍然应该有一种捕获像“All cows say mooo”这样的业务规则的方法。您的解决方案非常接近,可能是首选的Go方法,但是如果有任何方法可以将动物的类型与其解决方案中具有的优势相结合。 –