Dart--抽象类 多态以及接口

28 阅读3分钟

1.Dart抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口。

(1)抽象类通过abstract关键字来定义

(2)Dart中的抽象方法不能用abstract声明,Dart中没有方法体的方法我们称为抽象方法。

(3)如果子类继承抽象类必须得实现里面的抽象方法。

(4)如果把抽象类当作接口实现的话必须得实现抽象类里面定义的所有属性和方法。

(5)抽象类不能被实例化,只有继承它的子类可以。

extends抽象类和implements的区别:

(1)如果要复用抽象类里面的方法,并且要用抽象方法约束子类的话我们就用extends继承抽象类。

(2)如果只是把抽象类当作标准的话,我们就用implements实现抽象类。

/**
 * 案例:定义一个Fruit类要求它的子类必须包含grow方法
 */
abstract class Fruit {
  void grow(); //抽象方法
  void need(); //抽象方法
  void printInfo() {
    print('抽象类的普通方法');
  }
}

class Apple extends Fruit {
  @override
  void grow() {
    print('Apple grow for long time');
  }

  @override
  void need() {
    print('Apple需要大量的水');
  }
}

class Banana extends Fruit {
  @override
  void grow() {
    print('Banana grow in hot');
  }

  @override
  void need() {
    print('Banana need large water');
  }
}

void main() {
  Apple apple = new Apple();
  apple.grow();
  apple.need();
  apple.printInfo();
}

2.Dart中的多态

允许将子类类型的指针赋值给父类类型的指针,同一个函数调用会有不同的执行结果。

子类的实例赋值给父类的引用。

多态就是父类定义一个方法不去实现,让继承它的子类去实现,每个子类有不同的表现.

abstract class Food {
  void describe();
}

class Egg extends Food {
  @override
  void describe() {
    print('egg good taste');
  }

  void show() {
    print('Show');
  }
}

class Meat extends Food {
  @override
  void describe() {
    print('Meat good');
  }

  void show() {
    print('meat show');
  }
}

void main() {
  //将子类类型的实例赋值给父类的指针,则只能访问父类中的方法,而不能访问子类中的方法
  Food f = new Egg();
  f.describe();

  Food ff = new Meat();
  ff.describe();
}

3.接口

和Java一样,dart也有接口,但是和Java还是有区别的。

首先,dart的接口没有interface关键字定义接口,而是普通类或抽象类都可以作为接口被实现。

同样使用implements关键字进行实现。

但是dart的接口有点奇怪,如果实现的是普通类,会将普通类和抽象类中的属性和方法全部需要覆写一遍。

而因为抽象类可以定义抽象方法,普通类不可以,所以一般如果要实现像java接口那样的样式,一般会使用抽象类。

建议使用抽象类定义接口。

/**
 * 定义一个DB库 支持mysql mssql mongodb
 * mysql mssql mongo三个类里面都有同样的方法
 * 当作接口  接口:就是约定、规范
 */
abstract class Db {
  String? url;
  void add(String add);
  void save();
  void delete();
}

class Mysql implements Db {
  @override
  String? url;

  Mysql(this.url);

  @override
  void add(String data) {
    print('Mysql add:$data');
  }

  @override
  void delete() {
    print('Mysql delete');
  }

  @override
  void save() {
    print('Mysql save');
  }
}

class Mssql implements Db {
  @override
  String? url;

  @override
  void add(String add) {}

  @override
  void delete() {}

  @override
  void save() {}
}

class Mongodb implements Db {
  @override
  String? url;

  @override
  void add(String add) {}

  @override
  void delete() {}

  @override
  void save() {}
}

void main() {
  Mysql mysql = new Mysql('xxx');
  mysql.add('ddd');
}

4.接口文件分离

实际开发中为了更好的维护,通常抽象类会和实现类分别写在不同的文件中。