0Pricing
Dart Academy · 课时

优先使用组合而非继承

在适合的场景中优先采用包含关系设计

优先使用组合而非继承 是 CoddyKit 上的免费 Dart Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Dart Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Dart Academy 课程共包含 4 节课。

两种复用方式

您可以通过继承行为来复用它,也可以持有另一个对象。第二种方式称为组合。

“是一个”与“拥有一个”

继承表示“是一个”:Circle 是 Shape。组合表示“拥有一个”:Car 拥有一个 Engine。

组合类

使用组合时,您可以将辅助对象存储为字段,并将工作委托给它,而不是继承它。

class Car {
  final Engine engine = Engine();
}

委托行为

外部类将调用转发给内部对象。这种委托无需继承就能复用逻辑。

class Car {
  final engine = Engine();
  void start() => engine.ignite();
}

脆弱基类问题

深层继承很脆弱。父类的改动可能悄无声息地破坏很远处的子类,这种陷阱称为脆弱基类。

运行时的灵活性

组合让您可以随时替换内部对象。继承一旦确定就固定了,但字段可以改变。

class Car {
  Engine engine;
  Car(this.engine);
}

与接口结合

将组合与接口结合起来:依赖抽象的Engine类型,这样任何匹配的引擎都能顺利接入。

abstract class Engine {
  void ignite();
}

更易于测试

由于各部分是相互独立的对象,您可以在测试中传入一个伪对象。组合让模拟变得简单自然。

var car = Car(FakeEngine());

避免继承错误的内容

子类会继承每个成员,包括它们不应公开的成员。组合只共享您选择委托的内容。

继承仍然更合适的情况

如果存在明确的“是一个”关系并且共享身份,继承就很合适。当关系实际上是“拥有一个”时,请优先考虑组合。

实用规则

默认优先使用组合,谨慎使用继承。这样可以让设计保持松耦合,并且以后易于修改。🧩

快速检查

关于组合的一个快速问题。

回顾

组合通过持有其他对象并将工作委托给它们来表示“拥有一个”。它保持灵活且易于测试,而继承适合明确的“是一个”关系。👍

常见问题解答

「优先使用组合而非继承」课时是免费的吗?

是的 — 「优先使用组合而非继承」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Dart Academy 课程的其余内容,请升级到 CoddyKit PRO。 Dart Academy 课程共包含 4 节课。

「优先使用组合而非继承」这节课中我会学到什么?

在适合的场景中优先采用包含关系设计 你通过在浏览器中直接运行的动手代码来练习 Dart Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Dart Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Dart Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「优先使用组合而非继承」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Dart Academy 课中编写并运行代码吗?

能。每节 Dart Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 抽象类和抽象方法
  2. 隐式接口和 implements
  3. 通过共享类型实现多态
  4. 优先使用组合而非继承
← 返回 Dart Academy