考慮下面的接口對象...圍棋和麪向範式
type Person struct {
name, gender string
}
type Citizen interface {
Create(name string) Citizen
GetName() string
GetGender() String
SayHello() String
}
...及以下Male
和Female
實現:
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
是特定性別的,是有一種讓Male
和Female
繼承方法GetName
和GetGender
的通用實現?
a)* Go *中沒有繼承;和b)構造函數不應該是它們構造類型的接口的一部分,它們應該是函數(而不是方法)。 – Adrian