【发布时间】:2014-04-14 01:04:56
【问题描述】:
我正在尝试理解 Google Go 的嵌入机制(作为子类化的替代方案)。下面是一个简单的程序,总结了我对这种方法的问题:
package main
import "fmt"
type Person struct {
Name string
}
func (p *Person) Talk() {
fmt.Println("Hi, my name is Person")
}
func (p *Person) TalkVia() {
fmt.Println("TalkVia ->")
p.Talk()
}
type Android struct {
Person
}
func (p *Android) Talk() {
fmt.Println("Hi, my name is Android")
}
func main() {
fmt.Println("Person")
p := new(Person)
p.Talk()
p.TalkVia()
fmt.Println("Android")
a := new(Android)
a.Talk()
a.TalkVia()
}
输出是:
Person
Hi, my name is Person
TalkVia ->
Hi, my name is Person
Android
Hi, my name is Android
TalkVia ->
Hi, my name is Person
但如果我是子类化(用另一种语言),输出将是:
Person
Hi, my name is Person
TalkVia ->
Hi, my name is Person
Android
Hi, my name is Android
TalkVia ->
Hi, my name is Android
有没有办法通过 google go 嵌入(不是接口)来实现最后的输出?
【问题讨论】:
-
嵌入不是子类化的替代方法。在 Go 编程时忘记子类化:你的设计会更好。
-
@Volker:我同意。但是我想了解如何重用上游项目的代码。我需要更改一个(许多)方法,并且上游没有声明/使用的接口(与这段代码相关)。
标签: go embedding subclassing