Go与面向对象范式

Go与面向对象范式,go,Go,给定以下接口 type Person struct { name, gender string } type Citizen interface { Create(name string) Citizen GetName() string GetGender() String SayHello() String } 。。。以及以下男性和女性实现: type Male Person func (m *Male) Create(name) Citizen

给定以下接口

type Person struct {
    name, gender string
}

type Citizen interface {
    Create(name string) Citizen
    GetName() string
    GetGender() String
    SayHello() String
}
。。。以及以下
男性
女性
实现:

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
是针对性别的,有没有办法让
男性
女性
继承方法
GetName
GetGender
的通用实现?

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())
}
请参见此处的完整示例:


这使用了界面
Citizen
而不是作业中的类型
Person
,因此请告诉我这是否不是您要查找的内容。

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())
}
请参见此处的完整示例:


这使用的是界面
Citizen
而不是作业中的类型
Person
,因此如果这不是您要查找的,请告诉我。

好的,您从界面中删除了
Create
方法,并将其余的放在
Person
实现中。。。但是,如果界面有另一种方法(即,
SayHello
)是针对性别的呢?@j3d完全一样。更新了添加
SayHello
方法的答案。我只删除了
Create
,因为创建一个空白的人来调用
Create
方法似乎没有什么用处。如果你愿意,我可以把它加回去,现在已经清楚了:-)非常感谢你的支持@j3d如果您想保留它,它包括男/女
Create
方法。实际上,离开
Create
方法弊大于利。。。实际上,它没有任何好处,只会损害接口。好的,您从接口中删除了
Create
方法,并将其余的放在
Person
实现中。。。但是,如果界面有另一种方法(即,
SayHello
)是针对性别的呢?@j3d完全一样。更新了添加
SayHello
方法的答案。我只删除了
Create
,因为创建一个空白的人来调用
Create
方法似乎没有什么用处。如果你愿意,我可以把它加回去,现在已经清楚了:-)非常感谢你的支持@j3d如果您想保留它,它包括男/女
Create
方法。实际上,离开
Create
方法弊大于利。。。实际上,它没有什么好处,只会损害接口。a)Go中没有继承;构造函数不应该是它们构造的类型的接口的一部分,它们应该是函数(而不是方法);构造函数不应该是它们构造的类型的接口的一部分,它们应该是函数(而不是方法)。