用golang來面向物件程式設計
阿新 • • 發佈:2019-02-03
我們都知道,面向物件的三個要素:封裝,繼承,多型。而golang其實不能稱之為嚴格意義上面向物件的語言,但我今天在網上翻閱到一篇用golang來寫面向物件程式碼的文章,提供了一個思路,是英文的,這裡我把它翻譯了一下,供大家和自己參考。
翻譯:
傳統的面向物件程式設計中提供了三個特性。當 Dog 從 Animal 繼承
1,該Dog將重用Animal的程式碼。
2,x 型別的變數Animal可以指a Dog或a Animal,即基類可以指向子類。
3,x.Eat()將Eat根據什麼型別的物件x引用來選擇一種方法,即多型性。
在面向物件的行話來說,這些特徵被稱為程式碼重用,多型性和動態排程。
所有這些都可以在Go中使用,使用方式如下:
1,組合和嵌入 來實現程式碼重用。
2,interface 來實現多型性和動態分配。
組合
type Animal struct {
// …
}
type Dog struct {
beast Animal
// …
}
嵌入
type Animal struct {
// …
}
func (a *Animal) Eat() { … }
func (a *Animal) Sleep() { … }
func (a *Animal) Breed() { … }
type Dog struct {
beast Animal
// …
}
func (a *Dog) Eat() { a.beast.Eat() }
func (a *Dog) Sleep() { a.beast.Sleep() }
func (a *Dog) Breed() { a.beast.Breed() }
這樣通過組合和嵌入,實現了Dog對Animal成員變數和成員方法的繼承,雖然寫起來有些繁瑣。
interface
type Sleeper interface {
Sleep()
}
func main() {
pets := []Sleeper{new(Cat), new (Dog)}
for _, x := range pets {
x.Sleep()
}
}
翻譯完畢。
我覺得前半段,即組合和嵌入可以給我們未來如果要用面向物件的思想去寫go的話,提供了個不錯的想法。後半段interface大家肯定再熟悉不過了。