Ich möchte einen solchen Code implementieren, in dem B von A erbt und nur die Methode Foo() von A überschreibt, und ich hoffe, dass der Code B.Foo() ausgibt, aber stattdessen A.Foo() ausgibt. Es scheint, dass der Empfänger in Golang nicht so wie in C++ funktionieren kann, bei dem dynamische Bindung aktiviert ist, kann der Code so funktionieren, wie ich es möchte.
Ich poste auch ein weiteres Stück Code, das funktioniert, aber zu schwer zu implementieren ist und eher wie ein Hack aussieht. Ich denke, dass dies nicht im Golang-Stil ist.
Also mein Problem ist: Wenn die Bar()-Methode des Elternteils einige Logik hat, z. B. eine Datei öffnen, einige Zeilen lesen und Foo() verwenden, um diese Zeilen in stdout
auszugeben, und das Kind (im Beispiel B) die meisten davon verwenden möchte, der einzige Unterschied besteht darin, dass das Kind möchte, dass Foo() die Zeilen in eine andere Datei ausgibt. Wie sollte ich das implementieren? Ich habe gehört, dass die Vererbung in Golang nicht wie in C++ oder Java funktionieren kann, und wie ist der richtige Weg in 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()
Das folgende Stück Code funktioniert, aber wenn du
a := A{}
a.Bar()
schreibst, tritt ein Compilerfehler auf
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 // hier arbeitet i wie ein Attribut von b
b.Bar()
output: B.Foo()