我想实现这样的代码,其中 b 继承自 a,并且只覆盖 a 的 Foo ()方法,我希望代码能够打印 b. Foo () ,但是它仍然打印 a. Foo () ,看起来 Golang 的接收器在 c + + 中不能像这样工作,在 c + + 中,当启用动态绑定时,代码可以像我想要的那样工作。
我还发布了另外一段代码,它能工作,但是实现起来太难了,更像是一种黑客方式,我认为它不是 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()