在 Dart 语言中,父类继承、接口实现和混入(mixin)是实现代码复用和构建灵活应用的重要手段。
1. 父类继承
父类继承是指一个类继承另一个类的属性和方法。Dart 中使用 extends
关键字实现继承。
特点:
- 子类自动拥有父类的非私有属性和方法。
- 可以通过
super
关键字调用父类的方法或构造函数。 - Dart 是单继承语言,一个类只能继承一个父类。
使用场景:
- “is-a” 关系:当子类是父类的具体化时,比如
Car
是Vehicle
的一种。 - 共享通用行为:如果多个子类需要共享父类中定义的属性和方法。
- 需要重用逻辑:父类中定义了一些逻辑,子类只需重用或稍作修改。
示例:
class Vehicle {
void move() => print("Vehicle is moving");
}
class Car extends Vehicle {
void move() => print("Car is moving");
}
2. 接口实现
Dart 中的每个类都可以用作接口。通过 implements
关键字实现接口。
特点:
- 接口是一个类的公共方法签名的契约。
- 实现接口的类需要重写所有接口定义的方法。
- 一个类可以实现多个接口。
使用场景:
- 定义契约:当需要确保某些类遵循某种行为规范时,比如
Serializable
接口强制类实现序列化相关方法。 - 多态行为:可以通过接口类型的引用来调用不同实现类的方法。
- 分离逻辑:使用接口将行为与实现分离,便于扩展和替换。
示例:
abstract class Flyable {
void fly();
}
class Bird implements Flyable {
void fly() => print("Bird is flying");
}
3. 混入(Mixin)
混入是一种通过 mixin
关键字引入代码复用的方式,可以将多个类的功能混入到目标类中。
特点:
- 使用
mixin
关键字定义。 - 一个类可以混入多个
mixin
。 - 混入不需要继承,而是通过直接引入的方式复用代码。
- 混入不能有构造函数。
使用场景:
- 代码复用:当多个类需要共享某些功能,但它们之间没有明显的继承关系。
- 组合行为:需要将不同的功能组合到一个类中,而不使用继承树。
- 避免多重继承:通过混入代替传统的多重继承。
示例:
mixin Swimmable {
void swim() => print("Can swim");
}
mixin Walkable {
void walk() => print("Can walk");
}
class Duck with Swimmable, Walkable {}
如何选择?
- 父类继承:用于类之间存在自然的“is-a”关系,比如动物和狗。
- 接口实现:当需要确保某些类提供特定行为时,比如持久化、序列化。
- 混入:当需要多个类共享行为,但它们之间没有继承关系时,比如“会飞的”和“会游泳的”。
通过根据场景的需求选择合适的模式,可以让代码更加清晰、模块化和易于维护。