是否有一些技巧可以在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/