首页  >  文章  >  后端开发  >  Go 中的组合优于继承

Go 中的组合优于继承

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-30 12:24:02360浏览

Composition Over Inheritance in Go

设计软件时,“组合优于继承”原则通常会带来更灵活、可维护的代码。 Go 以其独特的面向对象设计方法,严重依赖于组合而不是继承。让我们看看为什么。

为什么 Go 更喜欢组合

在传统的 OOP 语言中,继承允许一个类从另一个类继承行为和属性,但这可能会导致僵化的、难以更改的层次结构。 Go 完全避免继承,而是鼓励组合——通过组合更小的、集中的组件来构建类型。

行动中的作文

想象一下,我们正在为一家拥有不同类型员工的公司建模:有些是工程师,有些是经理,有些是实习生。我们不会创建复杂的类层次结构,而是将特定行为定义为独立类型,然后组合它们。

示例:Go 中的 Worker 行为

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")
}

这里:

  • 工程师和经理嵌入 Payable,给他们发薪水。
  • Manager 还嵌入了 Manageable,赋予他们团队管理能力。
  • 每种类型单独实现 Work(),满足 Worker 接口。

组合的好处

  • 简单性:每个行为都封装在其结构中,使其易于扩展。
  • 灵活性:可以在不破坏现有代码的情况下添加新类型或行为。
  • 可重用性:行为是模块化的,因此我们可以轻松地以不同的方式组合它们。

使用组合接口

在 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn