Go では、埋め込み構造体は基本構造体のフィールドとメソッドを継承します。ただし、基本構造体と埋め込み構造体の両方が同じ名前のメソッドを実装すると、競合が発生する可能性があります。この記事では、基本構造体に影響を与えることなく、埋め込まれた構造体のメソッドをオーバーライドする解決策について説明します。
次のコードを考えてみましょう。
<code class="go">package main import "fmt" type Base struct { val int } func (b *Base) Set(i int) { b.val = i } type Sub struct { Base changed bool } func (b *Sub) Set(i int) { b.val = i b.changed = true } func main() { s := &Sub{} s.Base.Set(1) var b *Base = &s.Base // Both print the same value fmt.Printf("%+v\n", b) fmt.Printf("%+v\n", s) }</code>
ここでは、Sub 型が Base 型を埋め込んでいます。 Sub と Base の両方には Set という名前のメソッドがあり、s.Base.Set() を呼び出すと、Sub.Set() メソッドをバイパスして Base.Set() メソッドを直接呼び出します。
To埋め込み構造体のメソッドをオーバーライドする場合は、代わりに Sub.Set() メソッドを呼び出すことができます。 Go では、型がその埋め込み型と同じ名前のメソッドを実装する場合、埋め込みメソッドは非表示になります。
コードの更新バージョンは次のとおりです。
<code class="go">func (b *Sub) Set(i int) { b.Base.Set(i) // Call the Base.Set() method b.changed = true } func main() { s := &Sub{} s.Set(1) var b *Base = &s.Base // Note: b.val is now 1 // s.changed is now true fmt.Printf("%+v\n", b) fmt.Printf("%+v\n", s) }</code>
この例ではs.Set(1) を呼び出すと、Sub.Set() メソッドが呼び出され、次に Base.Set() メソッドが呼び出されます。これにより、Sub に埋め込まれた Base 構造体の val フィールドが更新されます。 Changed フィールドも true に設定され、値が変更されたことを示します。
このソリューションを使用すると、基本構造体に影響を与えることなく、埋め込み構造体のメソッドをオーバーライドできます。これは、コードの再利用性と柔軟性を実現するために Go で使用される一般的な手法です。
以上が基本構造体に影響を与えずに Go で埋め込み構造体メソッドをオーバーライドする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。