ソフトウェアを設計する場合、「継承よりも合成」の原則により、より柔軟で保守しやすいコードが得られることがよくあります。 Go は、オブジェクト指向設計に対する独自のアプローチを採用しており、継承ではなく合成に重点を置いています。その理由を見てみましょう。
従来の OOP 言語では、継承により、あるクラスが別のクラスから動作やプロパティを継承できますが、これにより、厳格で変更が難しい階層が生じる可能性があります。 Go は継承を完全に回避し、代わりに合成を奨励します。つまり、より小さく焦点を絞ったコンポーネントを組み合わせて型を構築します。
さまざまなタイプの従業員がいる会社をモデル化していると想像してください。エンジニア、マネージャー、インターンなどの従業員もいます。複雑なクラス階層を作成する代わりに、特定の動作を独立したタイプとして定義し、それらを構成します。
package main import "fmt" type Worker interface { Work() } type Payable struct { Salary int } func (p Payable) GetSalary() int { return p.Salary } type Manageable struct{} func (m Manageable) Manage() { fmt.Println("Managing team") } type Engineer struct { Payable } func (e Engineer) Work() { fmt.Println("Engineering work being done") } type Manager struct { Payable Manageable } func (m Manager) Work() { fmt.Println("Managerial work being done") }
こちら:
Go では、インターフェースと構成が連携して、継承なしのポリモーフィズムを可能にします。単一の関数で複数のワーカー タイプを処理する方法は次のとおりです。
func DescribeWorker(w Worker) { w.Work() } func main() { engineer := Engineer{Payable{Salary: 80000}} manager := Manager{Payable{Salary: 100000}, Manageable{}} DescribeWorker(engineer) DescribeWorker(manager) }
Go が継承よりも合成を好むのは、単なる言語の癖ではありません。これにより、変更に適応できる、よりクリーンでモジュール化されたコードが奨励されます。厳格な階層の代わりに、柔軟で再利用可能なコンポーネントが得られ、コードベースを機敏に保ち、保守が容易になります。
以上がGo における継承よりも構成の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。