之前的系列文章我们已经初步涉猎了继承和多态。本文,我们来聊聊它们。

继承

​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();

如果读者觉得文章还可以,不防一键三连:关注➕点赞➕收藏