Dart 知识点 - 继承和多态

2022-09-19 14:59:45 浏览数 (1)

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情

推荐使用线上编辑器 dartpad.cn 进行学习,测试~

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

继承

Dart 中的继承是单继承,也就是一个类只能有一个直接的父类。默认继承父类 Object 类。使用 extends 关键字,子类会继承父类的属性和方法。

代码语言:javascript复制
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() 即可,如下:

代码语言:javascript复制
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 的关键字,推荐加上关键字的写法,让人知道这个方法在父类上存在的。

多态

多态是同一种行为具有不同表现形式或形态。

优点:

  • 消除类型之间的耦合关系
  • 可替代性
  • 可扩充性
  • 接口性
  • 灵活性
  • 简化性

存在的三个必要条件:

  • 继承
  • 重写
  • 父类引用指向子类对象
代码语言:javascript复制
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.');
  }
}

比如上面的示范。DogSheep 都继承于 Animal,两者都重写了 Animal 中的 eat() 方。上面声明的两个对象实例都是父类的 Animal,但是实际指向的都是子类的一个对象。

代码语言:javascript复制
Animal dog = new Dog(); 
Animal sheep = new Sheep();

0 人点赞