1. 程式人生 > >用golang來面向物件程式設計

用golang來面向物件程式設計

我們都知道,面向物件的三個要素:封裝,繼承,多型。而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大家肯定再熟悉不過了。