Dart 中 extends, with, implements, on 关键字详解
2023-09-29 16:06:29
想要在 Dart 中灵活使用类,就需要熟知 extends、with、implements、on 这四个的用法和区别。这篇文章将深入解析这四个关键字,助你全面掌握 Dart 中类的继承和混合机制。
Dart 是支持基于 mixin 继承机制的面向对象语言,所有对象都是一个类的实例,而除了 Null 以外的所有类都继承自 Object 类。了解这四个关键字的用法和区别,对灵活使用类大有裨益。
1. extends:传统继承
Dart 中的类继承采用 extends 关键字。通过 extends,可以派生出一个子类,该子类继承父类的所有属性和方法。子类可以重写父类的方法,以提供自己的实现。
例如,我们可以定义一个 Animal
类,它具有 name
和 age
属性。然后,我们可以定义一个 Dog
类,它继承自 Animal
类,并添加了 breed
属性。
class Animal {
String name;
int age;
Animal(this.name, this.age);
void speak() {
print('Animal $name says...');
}
}
class Dog extends Animal {
String breed;
Dog(String name, int age, this.breed) : super(name, age);
@override
void speak() {
print('Dog $name says woof!');
}
}
2. with:mixin 继承
mixin 是一种特殊的类,它不能被实例化,但可以被其他类继承。mixin 的作用是将代码复用。例如,我们定义一个 Flyable
mixin,它提供了一个 fly()
方法。然后,任何类都可以通过 with
关键字继承 Flyable
mixin,从而获得 fly()
方法。
mixin Flyable {
void fly() {
print('I can fly!');
}
}
class Bird with Flyable {
String name;
Bird(this.name);
void sing() {
print('Bird $name sings...');
}
}
3. implements:接口实现
接口是一种定义了方法签名的类,它不包含任何实现。类可以通过 implements
关键字实现接口,从而获得接口中定义的方法。接口可以有多个实现类,实现类可以是不同的类型。
例如,我们定义一个 Drawable
接口,它定义了一个 draw()
方法。然后,我们可以定义一个 Circle
类和一个 Rectangle
类,它们都实现 Drawable
接口。
abstract class Drawable {
void draw();
}
class Circle implements Drawable {
int radius;
Circle(this.radius);
@override
void draw() {
print('Drawing a circle with radius $radius.');
}
}
class Rectangle implements Drawable {
int width;
int height;
Rectangle(this.width, this.height);
@override
void draw() {
print('Drawing a rectangle with width $width and height $height.');
}
}
4. on:类型混入
on
关键字用于指定 mixin 的类型参数。在某些情况下,需要为 mixin 指定类型参数,以便在继承时正确地解析类型。例如,我们可以定义一个 Comparable
mixin,它比较两个对象的大小。
mixin Comparable<T> {
int compareTo(T other);
}
class Person implements Comparable<Person> {
String name;
int age;
Person(this.name, this.age);
@override
int compareTo(Person other) {
return age - other.age;
}
}
对比总结
这四个关键字在 Dart 中的使用场景有所不同,下面总结一下他们的区别:
- extends :用于单继承,子类继承父类所有属性和方法,可以重写父类方法,提供自己的实现。
- with :用于 mixin 继承,mixin 不能被实例化,但可以被其他类继承,mixin 的作用是将代码复用。
- implements :用于接口实现,接口定义方法签名,但没有实现,类可以通过 implements 实现接口,从而获得接口中定义的方法。
- on :用于指定 mixin 的类型参数,在某些情况下,需要为 mixin 指定类型参数,以便在继承时正确地解析类型。
希望这篇文章能让你对 Dart 中的继承和混合机制有更深入的了解。