Go では、構造体が別の構造体から継承するとき (埋め込みと呼ばれます)、埋め込まれた構造体のすべてのフィールドとメソッドを継承します。構造体。ただし、継承する構造体が、埋め込み構造体のメソッドと同じ名前で独自のメソッドを定義している場合、埋め込みメソッドは非表示、つまりシャドウされます。
オーバーライド埋め込み構造体のメソッドには、次の構文を使用して埋め込み構造体のメソッドに明示的にアクセスする必要があります。
<code class="go">yourStruct.EmbeddedStruct.method()</code>
例:
<code class="go">type Base struct { val int } func (b *Base)Set(i int) { b.val = i } type Sub struct { Base changed bool }</code>
ここで、Sub は Base を埋め込みます。ただし、Sub の Set メソッドは Base の Set メソッドをオーバーライドします。 Base の元の Set メソッドを Sub 内から呼び出すには、b.Base.Set(i) を明示的に呼び出す必要があります。
次のコードを考えてみましょう。
<code class="go">func t16() { s := &Sub{} s.Set(1) var b *Base = &s.Base fmt.Printf("%+v\n", b) fmt.Printf("%+v\n", s) }</code>
最初に、Sub の Set メソッドが呼び出され、Base の Set メソッドがオーバーライドされます。 Base の Set メソッドの元の動作を示すには、s.Base.Set(10):
<code class="go">func t16() { s := &Sub{} s.Base.Set(10) var b *Base = &s.Base fmt.Printf("%+v\n", b) fmt.Printf("%+v\n", s) }</code>
を呼び出すことができます。これにより、Base の元の Set メソッドが確実に呼び出され、Sub のカスタム Set メソッドとその後の変更がバイパスされます。変更されました。
以上がGo で埋め込み構造体メソッドをオーバーライドするには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。