ホームページ >バックエンド開発 >Golang >オブジェクトの継承なしでポリモーフィズムを実装するにはどうすればよいでしょうか?

オブジェクトの継承なしでポリモーフィズムを実装するにはどうすればよいでしょうか?

DDD
DDDオリジナル
2024-11-15 12:48:02230ブラウズ

How Can Go Implement Polymorphism Without Object Inheritance?

Go のポリモーフィズムを理解する

ポリモーフィズム、つまりオブジェクトがさまざまな形式を取る機能は、Go で実装されています。

問題:

トランザクションを表す BaseTX 構造体と、RewardTX とAllowanceTX という 2 つの特殊なトランザクション タイプを使用した仮説的なシナリオを考えてみましょう。 AllowanceTX は BaseTX を拡張し、フィールドを追加します。タスクは、両方のトランザクション タイプで動作する関数を実装し、json.Marshal() を使用してそれぞれのデータをシリアル化して保存することです。ただし、現在の実装では BaseTX 構造体のフィールドのみがシリアル化され、AllowanceTX の追加フィールドは省略されます。

最新の Go のアプローチ方法は次のとおりです:

Go は従来のをサポートしていませんオブジェクトの継承。ポリモーフィズムのインターフェイスのみに依存します。この問題を解決するには、次の代替実装を検討してください。

type TXapi interface {
    logicAndSaveTX()
}

type Metadata struct {
    Field1 string
    Field2 string
}

type RewardTX struct {
    Metadata
}

func (tx RewardTX) logicAndSaveTX() {
    // Logic to overwrite or modify `Metadata` fields ...
    fmt.Printf("saved this object: %+v \n", tx)
}

type AllowanceTX struct {
    Metadata
    AddField string
}

func (tx AllowanceTX) logicAndSaveTX() {
    // Logic to overwrite or modify `Metadata` fields ...
    // Additional logic for `AddField` ...
    fmt.Printf("saved this object: %+v \n", tx)
}

このアプローチでは、メタデータがスタンドアロンの構造体になり、各 RewardTX またはAllowanceTX タイプ内の埋め込みメタデータ フィールドで特殊な動作が可能になります。 logicAndSaveTX() メソッドは、それぞれの型に対して特に動作し、共通フィールドと固有フィールドの両方を適切に処理するようになりました。

Go のポリモーフィズムはインターフェイスを通じて実現され、同様の動作で多様なオブジェクト型を処理する柔軟で効率的な方法を提供します。このアプローチを採用することで、従来の継承の制限を回避し、Go のインターフェースベースの設計の長所を最大限に活用できます。

以上がオブジェクトの継承なしでポリモーフィズムを実装するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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