BはAから継承し、AのFoo()メソッドをオーバーライドするだけですが、B.Foo()を印刷するコードが欲しいですが、A.Foo()はまだ印刷されています。動的なバインディングが有効になっているとき、コードは私が望むように動作することができるC++で、Golangの受信機はこのように動作しません。golangの親構造体からオーバーライドされたメソッドを呼び出すことは可能ですか?
私はまた動作するコードをもう1つ掲載しますが、実装するのが難しく、ハックのようなものですが、ゴランスタイルではないと思います。
私の問題は、親のBar()メソッドにいくつかのロジックがある場合(たとえば、ファイルを開き、いくつかの行を読み込み、Foo()を使ってこれらの行をstdoutに出力し、Child例B)はそれらの大部分を使用したいが、唯一の違いは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()
、第二の例では、Iは、AとBの両方の複合インタフェース、達成するために組成物を使用し、これはencounragesをgolangものです。 – zhaozhi
ええ、私はあなたの2番目の例を書いているので、行く方法です。私は親構造体が独自のインタフェースではないように変更しています。 –
Not_a_Golfer、 "親構造体は独自のインタフェースではない"ということはどういう意味ですか - コード内でどのように見えますか、何を示唆していますか? :-) – Dac0d3r