2017-08-31 66 views
0

考慮下面的接口對象...圍棋和麪向範式

type Person struct { 
    name, gender string 
} 

type Citizen interface { 
    Create(name string) Citizen 
    GetName() string 
    GetGender() String 
    SayHello() String 
} 

...及以下MaleFemale實現:

type Male Person 

func (m *Male) Create(name) Citizen { 
    return &Person{name, "male"} 
} 

func (m *Male) GetName() string { 
    return m.name 
} 

func (m *Male) GetGender() string { 
    return m.gender 
} 

func (m *Male) SayHello() string { 
    return "Hello (male voice)" 
} 

type Female Person 

func (f *Female) Create(name) Citizen { 
    return &Person{name, "female"} 
} 

func (f *Female) GetName() string { 
    return f.name 
} 

func (f *Female) GetGender() string { 
    return f.gender 
} 

func (m *Female) SayHello() string { 
    return "Hello (female voice)" 
} 

func main() { 
    var p1 Person = &Male{} 
    var p2 Person = &Female{} 

    p1 = p1.Create("Joe") 
    p2 = p2.Create("Heidi") 

    log.Printf("%s is a %s",p1.GetName(), p1.GetGender()) 
    log.Printf("%s says %s",p1.GetName(), p1.SayHello()) 
    log.Printf("%s is a %s",p2.GetName(), p2.GetGender()) 
    log.Printf("%s says %s",p2.GetName(), p2.SayHello()) 
} 

由於只有Create是特定性別的,是有一種讓MaleFemale繼承方法GetNameGetGender的通用實現?

+1

a)* Go *中沒有繼承;和b)構造函數不應該是它們構造類型的接口的一部分,它們應該是函數(而不是方法)。 – Adrian

回答

4

MaleFemale類型中嵌入Person並將基本方法推到Person

type Male struct { 
    Person 
} 

type Female struct { 
    Person 
} 

func (m *Person) GetName() string { 
    return m.Name 
} 

func (m *Person) GetGender() string { 
    return m.Gender 
} 

func main() { 
    var c Citizen 
    c = CreateMale("Joe") 
    fmt.Println(c.GetName(), c.GetGender(), "\n", c.SayHello()) 
    c = CreateFemale("Jane") 
    fmt.Println(c.GetName(), c.GetGender(), "\n", c.SayHello()) 
} 

查看完整的例子在這裏:https://play.golang.org/p/GZcG-n_YpM

它使用在分配接口Citizen,而不是類型的Person,所以讓我知道這是不是你在找什麼。

+0

好的,您從界面中刪除了'Create'方法,並將其餘部分放在'Person'實現中......但如果界面具有另一種性別特定的方法(即SayHello)呢? – j3d

+0

@ j3d完全一樣。更新答案以添加「SayHello」方法。我只刪除了'Create',因爲創建一個空白的人來調用'Create'方法似乎不是很有用。如果您願意,我可以將其重新加入 – RayfenWindspear

+0

好的,現在很清楚:-)非常感謝您的支持! – j3d