分享

为什么Go语言使用组合而不是继承

 F2967527 2023-10-19 发布于天津

继承

什么是继承

在编程语言中,继承是一种使得某些类(子类)可以使用其他类(父类)的属性和方法的方式。子类通常被认为是父类的“特化”,它可以添加新的属性和方法,也可以修改从父类继承的行为。

当一个类(子类)继承了另一个类(父类):

  1. 子类会获得父类的所有公有和保护的属性与方法。这允许在子类中可以重用和修改父类的代码。

  2. 可以在子类中添加新的属性和方法,这对于增加新的功能非常有用。

  3. 子类可以覆盖(即重写)父类的方法,以改变从父类继承来的行为。

继承的优点

通常,大多数编程原则和理念都更倾向于推荐“组合大于继承”,这主要是因为过度使用继承可能导致代码过于复杂和难以维护。然而,继承也有其优势,下面列出几个重要的方面:

  1. 代码共享:继承允许子类自动共享父类的方法和属性,这对于消除代码重复非常有用。

  2. 子类型:如果B类继承自A类,那么所有需要A对象的地方,都可以使用B对象。这被称为“B是A的子类型”。这使得继承成为实现多态(一种类型的实例可以作为其父类的实例使用)的主要方式。

  3. 易于修改和扩展应用组件:通过创建一个共享父类的继承体系,可以更容易地修改和扩展共享行为。

尽管如此,当考虑使用继承时,要特别注意不要使类层次结构过于复杂,并确保所有继承关系都符合'是一个(is-a)'关系,而不仅仅是为了代码复用。否则,可能导致代码难于理解和维护。

组合

在编程语言中,组合是一种设计策略,它允许你将其他对象或数据类型作为一个类的部分来创建更复杂的数据类型。这是通过在新类中创建对其他对象的引用或实例来实现的。

例如,假设你正在创建一个“School”类,你可能需要将“Student”和“Teacher”类的实例作为“School”类的一部分组合起来。这样,'School'类就能包含并管理'Student'和'Teacher'对象。

特点:

  1. 组合提供了一种以组件方式表示一个对象,这些组件可以自由组合以形成更复杂的结构。

  2. 组合比继承更灵活,在运行时可以动态地改变组件。

  3. 组合允许你创建一个类,它的属性和行为是由其他类的对象实现的。

组合的优点

    在编程中,推荐组合大于继承有以下几个理由:

  1. 灵活性:组合提供了更高的灵活性,可以在运行时动态地改变一个对象的行为与属性。

  2. 解耦:组合可以降低对象之间的耦合度,使代码更易于理解和维护。

  3. 降低层次复杂性:过度使用继承会导致类层次的复杂性增加,而组合可以降低这种复杂性。

  4. 更好的代码重用:通过组合不同的对象,可以形成新的功能,而不必为了代码的重用强制进行类的继承。这降低了代码冗余,并提高了代码的重复利用率。

  5. 符合开闭原则:组合有助于满足开闭原则,即对扩展开放,对修改关闭。这意味着,你可以添加新的功能,而不减少或修改已有功能。

图片

为什么GO要使用组合而不是继承呢?

Go语言是Google公司推出的开源编程语言,它以简洁性和效率为首要原则。这种语言采用的是组合与接口,而不是传统的类继承方式。这主要有以下几个原因:

  1. 简化性:Go语言的设计者们专注于创建一种简单易学的语言。继承带来的诸多概念增加了学习和使用的复杂性,例如'super'、'this'、'base class'等词汇。通过采用组合,语义更清晰、更直接,简洁性也更易于维护。

  2. 灵活性:组合为建立和修改的代码结构带来灵活性。开发者可以进行微调,并在运行时动态改变一个对象的行为。反观继承,则往往会破坏封装性,容易造成代码逻辑的混乱。

  3. 易用性和类型安全:Go语言强调编译时的类型检查,而继承会破坏类型系统的严谨性。组合可以提供和继承类似甚至更好的代码重用方式,并保持类型系统的严谨和安全。

  4. 解耦:组合可以创建松散耦合的系统,每个组件都可以独立地工作,且可以按需替换。这使得代码更易于扩展和维护,因而更适合构建大型且复杂的应用。

然而,Go语言并没有完全忽视继承所带来的好处。Go通过接口实现了多态,这是一种在运行时动态确定对象类型的特性,只要类型实现了接口的所有函数,那么它就实现了该接口,不需要明确声明。这比传统的强类型语言继承机制提供了更大的灵活性,更符合开放封闭原则。

综上,Go语言采取组合,从本质上改变了面向对象编程的方式,使得代码结构更加直观、清晰,也为解决实际问题提供了更大程度的自由和灵活性。对于大型项目和分布式系统,这种设计模式更显优势。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多