ホームページ >バックエンド開発 >Golang >直接サポートせずに Go でメソッドのオーバーライドをエミュレートするにはどうすればよいでしょうか?

直接サポートせずに Go でメソッドのオーバーライドをエミュレートするにはどうすればよいでしょうか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-10 01:08:02984ブラウズ

How can you emulate method overriding in Go without direct support?

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 アプローチは、インターフェイスと埋め込みを使用することです。これを実現する方法は次のとおりです:

  1. インターフェイスの定義: Get() メソッドを定義する Getter という名前のインターフェイスを作成します:
type Getter interface {
    Get() string
}
  1. インターフェイスを埋め込む: 基本型に Getter インターフェイスを埋め込む:
type Base struct {
    Getter
}

func (base *Base) Get() string {
    return "base"
}
  1. 新しい型を定義する: 作成Base 型を埋め込み、Getter インターフェイスを実装する新しい型:
type Sub struct {
    Base
}

func (sub *Sub) Get() string {
    return "Sub"
}
  1. オーバーライドされたメソッドを呼び出す: Sub 型で、オーバーライドされた Get( Getter インターフェイスを使用して *Sub をレシーバーとして渡します:
func (sub *Sub) GetName() string {
    return sub.Base.GetName(sub)
}

このアプローチを利用すると、Sub 型は Base の完全な機能を維持しながら Get() メソッドをオーバーライドできます。タイプ。オーバーライドされたメソッドは Getter インターフェイスを通じて明示的に呼び出すことができ、レシーバーの型に基づいて適切なメソッドのディスパッチが保証されます。

以上が直接サポートせずに Go でメソッドのオーバーライドをエミュレートするにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。