是否有一些技巧可以在go中实现虚函数行为?我有以下示例。

package main

import "fmt"

type A struct {
}

type B struct {
*A
}

func (this *A) Do() {
    fmt.Println("IM DO")
    this.DoVirtual()
}

func (this *A) DoVirtual() {
    fmt.Println("IM DoVirtual Default implementation")
}

func (this *B) DoVirtual() {
    fmt.Println("IM DoVirtual B implementation")
}

func main() {
    a := &A{}
    a.Do()
    fmt.Println("----")
    b := &B{}
    b.DoVirtual()
    b.Do() // How to make here B.DoVirtual call
}

最后一次Do()调用也使用默认的DoVirtual实现,而实际上并不是我想要的。之所以如此,是因为它是go lang继承模型:在这种情况下,* B和* A是不同的指针,但我想知道是否有可能对这种行为进行一些模拟,以便最后一个调用中的DoVirtual可以从B类中使用。 。

最佳答案

到编译器选择func (this *A) Do() {时,封闭的B消失了,不再可用。 Go不支持is-a构造,仅支持has-a(组成)。如果实现了func (this *B) Do() {,它将取代* A上的Do()。当然,这并不是您真正想要的。

我认为关于实现和动机的最好解释是Rob Pike的Less is exponentially more

关于go - 进行虚拟功能仿真,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36884609/

10-11 11:13