Go メソッド オーバーライド: 継承のような動作の実現
Go では、従来のオブジェクト指向プログラミングの意味でのメソッド オーバーライドは直接サポートされていません。 。ただし、同様の機能を可能にする技術があります。インターフェイスと匿名の埋め込み構造体を利用して、メソッドのオーバーライド動作をエミュレートできます。
問題を理解する
Get で基本型 Base を定義する次のコード スニペットを考えてみましょう。 () メソッドと、単に Get() の結果を返す GetName() メソッドです。
type Base struct { } func (base *Base) Get() string { return "base" } func (base *Base) GetName() string { return base.Get() }
目的は、既存の Base 型の機能を保持しながら、Get() 実装をオーバーライドする新しい型を作成することです。 .
匿名埋め込みの使用
メソッドのオーバーライドをエミュレートする 1 つのアプローチは、匿名埋め込みを使用することです。 Base 型を埋め込む新しい型を定義します:
type Sub struct { Base } func (sub *Sub) Get() string { return "Sub" }
匿名の埋め込みは基本的に埋め込まれた Base 型のコピーであり、新しい Get() メソッドは別のメソッドで定義されているため、このメソッドは機能しません。 copy.
インターフェイスと埋め込みの活用
継承のような動作を実現するためのより慣用的な Go アプローチは、インターフェイスと埋め込みを使用することです。これを実現する方法は次のとおりです:
type Getter interface { Get() string }
type Base struct { Getter } func (base *Base) Get() string { return "base" }
type Sub struct { Base } func (sub *Sub) Get() string { return "Sub" }
func (sub *Sub) GetName() string { return sub.Base.GetName(sub) }
このアプローチを利用すると、Sub 型は Base の完全な機能を維持しながら Get() メソッドをオーバーライドできます。タイプ。オーバーライドされたメソッドは Getter インターフェイスを通じて明示的に呼び出すことができ、レシーバーの型に基づいて適切なメソッドのディスパッチが保証されます。
以上が直接サポートせずに Go でメソッドのオーバーライドをエミュレートするにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。