返回

Dart: extends vs implements vs with(Mixin) - 深入理解Dart中的继承、接口和混入

前端

Dart中,继承允许我们创建新类(派生类),它从一个现有的类(基类)继承属性和方法。通过继承,派生类可以重用基类中的代码,并添加自己的属性和方法来扩展或修改基类行为。

在Dart中,有三种继承方式:

  1. 继承(extends):使用extends,派生类从一个基类继承属性和方法。
  2. 实现(implements):使用implements关键字,派生类实现一个接口,接口定义了派生类必须实现的方法。
  3. 混入(with):使用with关键字,派生类可以将另一个类的属性和方法混入到自己中。

extends(继承)

extends关键字用于实现继承,派生类从一个基类继承属性和方法。例如:

class Vehicle {
  String make;
  String model;

  Vehicle(this.make, this.model);

  void drive() {
    print('Driving a $make $model');
  }
}

class Car extends Vehicle {
  int numWheels;

  Car(String make, String model, this.numWheels) : super(make, model);

  @override
  void drive() {
    print('Driving a $make $model with $numWheels wheels');
  }
}

void main() {
  Car car = Car('Toyota', 'Camry', 4);
  car.drive();
}

在上面的示例中,Car类从Vehicle类继承了make和model属性,以及drive()方法。Car类还添加了自己的numWheels属性和drive()方法。当创建Car类的实例时,会调用Car类的构造函数,它会调用父类Vehicle的构造函数来初始化make和model属性。

implements(实现)

implements关键字用于实现接口,接口定义了派生类必须实现的方法。例如:

abstract class Drawable {
  void draw();
}

class Circle implements Drawable {
  @override
  void draw() {
    print('Drawing a circle');
  }
}

class Square implements Drawable {
  @override
  void draw() {
    print('Drawing a square');
  }
}

void main() {
  Drawable circle = Circle();
  Drawable square = Square();

  circle.draw();
  square.draw();
}

在上面的示例中,Drawable接口定义了一个draw()方法,派生类Circle和Square都必须实现这个方法。当调用Circle类的draw()方法时,它会打印“Drawing a circle”,当调用Square类的draw()方法时,它会打印“Drawing a square”。

with(混入)

with关键字用于将另一个类的属性和方法混入到派生类中。例如:

class Flyable {
  void fly() {
    print('Flying');
  }
}

class Bird {
  void sing() {
    print('Singing');
  }
}

class Parrot extends Bird with Flyable {
  void talk() {
    print('Talking');
  }
}

void main() {
  Parrot parrot = Parrot();
  parrot.sing();
  parrot.fly();
  parrot.talk();
}

在上面的示例中,Flyable类定义了一个fly()方法,Bird类定义了一个sing()方法。Parrot类继承了Bird类,并使用with关键字混入了Flyable类。这样,Parrot类就拥有了sing()、fly()和talk()三个方法。

选择合适的继承方式

在选择合适的继承方式时,需要考虑以下因素:

  • 代码重用: 继承允许我们重用基类中的代码,这可以减少代码冗余并提高开发效率。
  • 扩展性: 继承允许我们通过派生类扩展基类,从而实现新的功能或行为。
  • 灵活性: 继承允许我们通过继承不同的基类来创建不同的派生类,从而实现不同的功能或行为。
  • 耦合性: 继承会增加派生类与基类的耦合性,这可能会影响代码的可维护性和灵活性。

根据不同的场景和需求,可以选择合适的继承方式来构建类层次结构,实现代码的重用性、扩展性和灵活性。