如何在Go中实现“虚拟继承”?
go lang编译器版本:“ 1.3.1 windows / amd64”,它支持Go的“虚拟继承”吗?
我从未听说过类似C的语言可以支持“虚拟”,所以我确实误会了。
Virtual Inheritance解决如果没有多重继承的情况下不存在的a problem。考虑以下继承树:
A
/ \
B C
\ /
D
如果类B和C都提供相同名称的数据成员(或方法),则在访问D中的所述成员时,您需要一种方法来消除您希望其祖先的数据成员(或方法)的歧义。访问。
虚拟继承是C ++的解决方案。
在Go中,您没有继承权;只能合成,您一次最多可以嵌入任何给定类型的1个成员。
http://play.golang.org/p/1iYzdoFqIC
package main
type B struct {
}
func (b B) Foo() {}
type C struct {
}
func (c C) Foo() {}
type D struct {
B
C
}
func main() {
d := D{B{}, C{}}
// d.Foo() // <- ambiguous
d.B.Foo() // <- ok
d.C.Foo() // <- ok
}
“虚拟继承”更像这样
http://play.golang.org/p/8RvPmB3Pof
package main
type A struct {
virtual int
}
func (a *A) set(v int) {
a.virtual = v
}
func (a *A) get() int {
return a.virtual
}
type B struct {
*A
}
type C struct {
*A
}
type D struct {
*B
*C
}
func main() {
a := &A{}
b := &B{a}
c := &C{a}
d := &D{b, c}
d.B.set(3)
println(d.C.get())
return
}