Go のポリモーフィズムを理解する: 構成ベースのアプローチ
Go では、オブジェクト指向言語とは異なり、ポリモーフィズムはインターフェイスを通じて実現されます。ポリモーフィズムを実装しようとする場合、構成の「基本」クラス/型の概念を避けることが重要です。
次の問題を考えてみましょう。
トランザクション用のフィールドと 2 つのフィールドを持つ BaseTX 構造体があります。特別なタイプ: RewardTX とAllowanceTX。後者には追加の AddField が必要です。さらに、オブジェクトをシリアル化して保存する前に特定のロジックを実行する関数logicAndSaveTXがあります。
ただし、現在の実装では、AddFieldプロパティは認識されません。
継承に依存する代わりに、より Go 慣用的なアプローチは、合成を使用することです。メタデータ構造体には、RewardTX とAllowanceTX の両方で使用される共有フィールドを含めることができます。各構造体は独自のlogicAndSaveTXメソッドを実装できます:
func (tx RewardTX) logicAndSaveTX() { // Logic on Metadata fields tx.Field1 = "overwritten" tx.Field2 = "logic done" // ... } func (tx AllowanceTX) logicAndSaveTX() { // Logic on Metadata fields tx.Field1 = "overwritten" tx.Field2 = "logic done" tx.AddField = "more stuff" // ... }
各型内で動作(メソッド)をカプセル化することで、ある型から別の型に操作を適用する際の落とし穴を回避できます。代わりに、管理する必要がある特定の型を操作する、明確で保守しやすいコードを設計できます。
以上がコンポジションを使用して Go でポリモーフィズムを実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。