携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情
推荐使用线上编辑器 dartpad.cn 进行学习,测试~
之前的系列文章我们已经初步涉猎了继承和多态。本文,我们来聊聊它们。
继承
Dart
中的继承是单继承,也就是一个类只能有一个直接的父类。默认继承父类 Object
类。使用 extends
关键字,子类会继承父类的属性和方法。
void main() {
Child child = new Child();
child.name = 'Jimmy';
child.sayHi(); // Jimmy say Hi.
}
class Father {
String name = ''; // 属性 - 名称
// 方法名
void sayHi() {
print(this.name ' say Hi.');
}
}
class Child extends Father {
double height = 0.0;
}
混入(Mixin)的语法,允许子类继承父类时混入其他的类。后面再讲解。
Child
继承了 Father
类的方法 sayHi()
,那么我们子类中能否使用这个方法呢?答案是能的。这里就涉及到方法重写了。我们在子类中新建一个父类同名的方法 sayHi()
即可,如下:
class Child extends Father {
double height = 0.0;
void sayHi() {
print('Child say Hi');
}
// @override
// void sayHi() {
// print('Child say Hi');
// }
}
再次运行代码 child.sayHi();
就会输出 Child say Hi
的文案了。
你可以为方法重写添加上
@override
的关键字,推荐加上关键字的写法,让人知道这个方法在父类上存在的。
多态
多态是同一种行为具有不同表现形式或形态。
优点:
- 消除类型之间的耦合关系
- 可替代性
- 可扩充性
- 接口性
- 灵活性
- 简化性
存在的三个必要条件:
- 继承
- 重写
- 父类引用指向子类对象
void main() {
Animal dog = new Dog();
dog.eat(); // Dog eat meat.
Animal sheep = new Sheep();
sheep.eat(); // Sheep eat grass.
}
class Animal {
void eat() {
print('Animal class eat.');
}
}
class Dog extends Animal {
@override
void eat() {
print('Dog eat meat.');
}
}
class Sheep extends Animal {
@override
void eat() {
print('Sheep eat grass.');
}
}
比如上面的示范。Dog
和 Sheep
都继承于 Animal
,两者都重写了 Animal
中的 eat()
方。上面声明的两个对象实例都是父类的 Animal
,但是实际指向的都是子类的一个对象。
Animal dog = new Dog();
Animal sheep = new Sheep();