ホームページ > バックエンド開発 > Golang > Go はポリモーフィズムをサポートしていますか: Setter メソッドの回避策を見つけるか?

Go はポリモーフィズムをサポートしていますか: Setter メソッドの回避策を見つけるか?

Patricia Arquette
リリース: 2024-11-25 13:27:11
オリジナル
246 人が閲覧しました

Does Go Support Polymorphism: Finding Workarounds for Setter Methods?

Go におけるポリモーフィズム: それは存在しますか?

ポリモーフィズム、異なるクラスのオブジェクトが同一のメソッドを持つ機能は、基本的な側面ですオブジェクト指向プログラミングのこと。ただし、Go では、インターフェイスの setter メソッドは使用できないようです。

基本的な例を見てみましょう:

type MyInterfacer interface {
    Get() int
    Set(i int)
}

type MyStruct struct {
    data int
}

func (this MyStruct) Get() int {
    return this.data
}

func (this MyStruct) Set(i int) {
    this.data = i
}
ログイン後にコピー

このコードを実行すると、MyStruct 型の Set メソッドは失敗します。受信者はポインタではありません。これに加えられた変更は、関数が終了すると失われます。

レシーバーをポインタに変更することでこれを修正することもできます。

func (this *MyStruct) Set(i int) {
    this.data = i
}
ログイン後にコピー

ただし、これによりコンパイル エラーが発生します。 。 Go のインターフェイス メソッドはポインター レシーバーを持つことができません。

では、このシナリオでポリモーフィズムを実現する方法はありますか?

最も近い代替方法は、インターフェイス型とインターフェイスを実装する匿名構造体:

type MyInterfacer interface {
    Get() int
    Set(i int)
}

var mi MyInterfacer = &MyStruct{123}
fmt.Println(mi.Get()) // prints 123

mi.Set(456)
fmt.Println(mi.Get()) // prints 456
ログイン後にコピー

このソリューションは真のポリモーフィズムではありませんが、インターフェイスを利用して提供しますさまざまなタイプのオブジェクトを操作するためのクリーンで柔軟な方法です。

以上がGo はポリモーフィズムをサポートしていますか: Setter メソッドの回避策を見つけるか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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