インターフェイスを使用して Go でメソッドのオーバーライドをどのように実現できますか?

Susan Sarandon
リリース: 2024-11-13 03:56:02
オリジナル
757 人が閲覧しました

How Can Method Overriding Be Achieved in Go Using Interfaces?

インターフェースを使用した 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート