Я хочу реализовать такой код, где B наследуется от A и переопределяет только метод Foo(), и я надеюсь, что код для печати B.Foo(), но он все еще печатает A.Foo(), кажется, что получатель в Golang не может так работать в C++, в котором, когда динамическое связывание включено, код может работать так, как я хочу.
Я также публикую еще один фрагмент кода, который работает, но его слишком сложно реализовать, и, скорее, как хакерский путь, я думаю, что это не стиль Голанга.
Поэтому моя проблема заключается в следующем: если родительский метод Bar() имеет некоторую логику, например, откройте файл, затем прочитайте несколько строк и используйте Foo(), чтобы вывести эти строки в стандартный stdout
, а затем в Child (в примере это B) хочет использовать большинство из них, с той лишь разницей, что Child хочет, чтобы Foo() выводила строки в другой файл. Как мне это реализовать? Я слышал, что наследование Голанга не может работать как C++ или Java, и какой правильный путь в Голанге?
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()