设计软件时,“组合优于继承”原则通常会带来更灵活、可维护的代码。 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中文网其他相关文章!