我想实现这样的代码,其中B继承A,只覆盖A的Foo()方法,希望代码打印B.Foo(),但还是打印A.Foo(),看来接收器在Golang 在 C++ 中不能这样工作,在启用动态绑定时,代码可以像我想要的那样工作。
我也贴了另外一段代码,可以用,但是实现起来太难了,更像是hack的方式,我觉得不是Golang的风格。
所以我的问题是:如果父的 Bar() 方法有一些逻辑,比如打开一个文件,然后读取一些行,并使用 Foo() 将这些行输出到stdout,而 Child(在示例中为 B)想要要使用其中的大部分,唯一的区别是 Child 希望 Foo() 将行输出到另一个文件。我应该如何实施它?听说Golang的继承不能像C++或Java那样工作,请问Golang的正确方法是什么?
package main
import (
"fmt"
)
type A struct {
}
func (a *A) Foo() {
fmt.Println("A.Foo()")
}
func (a *A) Bar() {
a.Foo()
}
type B struct {
A
}
func (b *B) Foo() {
fmt.Println("B.Foo()")
}
func main() {
b := B{A: A{}}
b.Bar()
}
output: A.Foo()
以下作品有效,但在写入时
a := A{}
a.Bar()
你会遇到编译器错误
package main
import (
"fmt"
)
type I interface {
Foo()
}
type A struct {
i I
}
func (a *A) Foo() {
fmt.Println("A.Foo()")
}
func (a *A) Bar() {
a.i.Foo()
}
type B struct {
A
}
func (b *B) Foo() {
fmt.Println("B.Foo()")
}
func main() {
b := B{A: A{}}
b.i = &b // here i works like an attribute of b
b.Bar()
output: B.Foo()
相关分类