go中如何實現(xiàn)多態(tài)

接觸go快半年了, 但是還是屬于那種用到時去搜索的狀態(tài), 沒有系統(tǒng)的去研究研究

go 是一種強類型的語言,每當(dāng)我從php切換到go時總有些許的不適應(yīng),但是追求優(yōu)雅,就不應(yīng)該妥協(xié)。

go沒有 implements, extends 關(guān)鍵字,所以習(xí)慣于 OOP 編程,或許一開始會有點無所適從的感覺。 但go作為一種優(yōu)雅的語言, 給我們提供了另一種解決方案, 那就是鴨子類型看起來像鴨子, 那么它就是鴨子.

那么什么是鴨子類型, 如何去實現(xiàn)呢 ?

接下來我會以一個簡單的例子來講述這種實現(xiàn)方案。

首先我們需要一個超類:

type Animal interface {
    Sleep()
    Age() int
    Type() string
}

必然我們需要真正去實現(xiàn)這些的子類:

type Cat struct {
    MaxAge int
}

func (this *Cat) Sleep() {
    fmt.Println("Cat need sleep")
}
func (this *Cat) Age() int {
    return this.MaxAge
}
func (this *Cat) Type() string {
    return "Cat"
}
type Dog struct {
    MaxAge int
}

func (this *Dog) Sleep() {
    fmt.Println("Dog need sleep")
}
func (this *Dog) Age() int {
    return this.MaxAge
}
func (this *Dog) Type() string {
    return "Dog"
}

我們有兩個具體實現(xiàn)類 Cat, Dog, 但是Animal如何知道Cat, Dog已經(jīng)實現(xiàn)了它呢? 原因在于: Cat, Dog實現(xiàn)了Animal中的全部方法, 那么它就認(rèn)為這就是我的子類。

那么如何去使用這種關(guān)系呢?

func Factory(name string) Animal {
    switch name {
    case "dog":
        return &Dog{MaxAge: 20}
    case "cat":
        return &Cat{MaxAge: 10}
    default:
        panic("No such animal")
    }
}

我們使用具體工廠類來構(gòu)造具體的實現(xiàn)類, 在調(diào)用時你知道有這些方法, 但是并不清楚具體的實現(xiàn), 每一種類型的改變都不會影響到其它的類型。

package main

import (
    "animals"
    "fmt"
)

func main() {
    animal := animals.Factory("dog")
    animal.Sleep()
    fmt.Printf("%s max age is: %d", animal.Type(), animal.Age())
}

來看看我們的輸出會是什么吧

> Output:
animals
command-line-arguments
Dog need sleep
Dog max age is: 20
> Elapsed: 0.366s
> Result: Success

這就是go中的多態(tài), 是不是比 implements/extends 顯示的表明關(guān)系更優(yōu)雅呢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 多態(tài)就是對象的多種形態(tài),即相同的消息使得不同的類做出不同的響應(yīng)。 多態(tài)存在的三個必要條件:繼承、重寫、父類變量引用...
    予別她閱讀 454評論 0 0
  • 一.成員變量與局部變量的區(qū)別 成員變量:在類中定義,用來描述對象將要有什么(屬性)。可被本類方法和其他跟當(dāng)前類有關(guān)...
    jeffierw閱讀 559評論 0 0
  • 多態(tài) 任何域的訪問操作都將有編譯器解析,如果某個方法是靜態(tài)的,它的行為就不具有多態(tài)性 java默認(rèn)對象的銷毀順序與...
    yueyue_projects閱讀 976評論 0 1
  • 面向?qū)ο蟮牧笤瓌t 單一職責(zé)原則 所謂職責(zé)是指類變化的原因。如果一個類有多于一個的動機被改變,那么這個類就具有多于...
    JxMY閱讀 961評論 1 3
  • 面向?qū)ο蟮腏avaScript 1.1 動態(tài)類型語言和鴨子類型 按照數(shù)據(jù)類型,編程語言可以分為兩大類:靜態(tài)類型語言...
    梁同學(xué)de自言自語閱讀 2,146評論 0 11