Dart学习(五)
抽象类
抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口。
- 抽象类通过abstract 关键字来定义;
- 抽象类中的抽象方法不能用abstract声明,抽象类中没有方法体的方法称为抽象方法;
- 子类继承抽象类必须实现抽象类中的抽象方法;
- 将抽象类当作接口实现必须实现抽象类中定义的所有属性和方法;
- 抽象类不能被实例化,继承它的子类可以;
abstract class Animal {
void sound();
void eat() {
print("Animal is eating.");
}
}
class Cat extends Animal {
void sound() {
print("Meow");
}
}
void main() {
//
// Animal animal = new Animal(); // 报错
Cat cat = new Cat();
cat.sound();
cat.eat();
}
多态
允许将子类类型的指针赋值给父类类型的指针,同一个函数会有不同的执行结果,即将子类的实例赋值给父类的引用;
Dart中多态的表现:父类中定义一个抽象方法,让继承他的子类去实现,每一个子类会有不同的表现;
abstract class Animal {
void sound(); // 抽象方法
}
class Cat extends Animal {
void sound() {
print("Meow!");
}
}
class Dog extends Animal {
void sound() {
print("Woof!");
}
}
void main() {
List<Animal> animals = [
new Cat(),
new Dog(),
];
for (Animal animal in animals) {
animal.sound(); // 输出不同的声音
}
}
extends和implements的使用场景
- 如果要复用抽象类中的方法,并且需要使用抽象类来约束所有继承的子类的时候用extends;
- 只是将抽象类当作标准的话使用implements实现抽象类接口;
接口
Dart中的接口是通过普通类或抽象类来实现的,使用implements关键字来实现;
实现接口会将普通类或抽象类中的属性方法全部重写,因此一般使用抽象类定义接口;
// 定义一个接口
abstract class Flyable {
void fly();
}
// 实现接口的类
class Bird implements Flyable {
void fly() {
print("I'm flying!");
}
}
// 测试Ï
void main() {
Flyable flyable = Bird();
flyable.fly(); // 输出:I'm flying!
}
Dart中一个类可以实现多个接口;
// 定义一个飞行行为的接口
abstract class Flyable {
void fly();
}
// 定义一个游泳行为的接口
abstract class Swimmable {
void swim();
}
// 定义一个可以飞行和游泳的鸟类
class Bird implements Flyable, Swimmable {
String _name;
Bird(this._name);
void fly() {
print('$_name is flying!');
}
void swim() {
print('$_name is swimming!');
}
}
void main() {
Bird bird = Bird('Sparrow');
bird.fly(); // 输出:Sparrow is flying!
bird.swim(); // 输出:Sparrow is swimming!
}