如何在Go中实现虚拟继承

问题描述 投票:2回答:2
  1. 如何在Go中实现“虚拟继承”?

  2. go lang编译器版本:“ 1.3.1 windows / amd64”,它支持Go的“虚拟继承”吗?

我从未听说过类似C的语言可以支持“虚拟”,所以我确实误会了。

go virtual-inheritance
2个回答
10
投票

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
}

-1
投票

“虚拟继承”更像这样

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
}
© www.soinside.com 2019 - 2024. All rights reserved.