我期待將一個「經典的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方法,但是如果有任何方法可以將動物的類型與其解決方案中具有的優勢相結合。 –