インターフェースを使用した Go でのメソッドのオーバーライド
メソッドのオーバーライドに基本クラスの実装の継承と変更が含まれる Java とは異なり、Go は次のソリューションを提供します。インターフェイス。
インターフェイスは、型が実装する必要があるメソッド シグネチャのセットを定義します。目的の動作に一致するメソッドを使用してインターフェイスを作成すると、元のインターフェイスの代わりに使用できる新しい型でインターフェイスを実装できます。
これを実現するには、次の例を検討してください。
type Base struct{} func (base *Base) Get() string { return "base" } func (base *Base) GetName() string { return base.Get() }
メソッドのオーバーライドを実装するには、インターフェイスを作成します。
type Getter interface { Get() string }
Getter を埋め込むように Base 型を変更します。インターフェイス:
type Base struct { Getter }
次に、Base を埋め込んで Get メソッドを実装する新しい型を作成します:
type Sub struct { Base } func (sub *Sub) Get() string { return "Sub" }
最後に、Getter インターフェイスを利用するように Base の GetName メソッドを変更します。
func (base *Base) GetName() string { if g, ok := base.Getter.(Getter); ok { return g.Get() } else { return base.Get() } }
このアプローチでは、Base の既存のコンシューマを保持しながら、Get メソッドをオーバーライドする機能を提供します。
または、次のメソッドを使用することもできます。
func New() *Sub { userType := &Sub{} userType.Getter = interface{}(userType).(Getter) return userType }
この場合、ユーザー コードで Getter フィールドを手動で設定して、メソッドのオーバーライドを有効にする必要があります。どちらの方法でも望ましい結果が得られますが、最初のアプローチは Go ではより慣用的であると考えられています。
以上がインターフェイスを使用して Go でメソッドのオーバーライドをどのように実現できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。