Dart中抽象类 多态以及接口

Dart中抽象类:Drat抽象类主要是用于定义标准,子类可以继承抽象类,也可以实现抽象类接口。
1、抽象类通过abstract关键字来定义
2、Drat中的抽象方法不能用abstract声明,Dart中没有方法体的方法我们称为抽象方法。
3、如果子类继承抽象类必须得实现里面的抽象方法
4、如果把抽象类当做接口实现的话必须得实现抽象类里面定义的所有属性和方法
5、抽象类不能被实例化,只有继承它的子类可以

extends抽象类和implements的区别:
1、如果要复用抽象类里面的方法,并且要用抽象方法约束子类的话我们就用extends继承抽象类
2、如果只是把抽象类当做标准的话我们就用implements实现抽象类

案例:定义一个Animal 类要求它的子类必须包括eat方法
抽象类的作用主要在于约束 定义标准,一个抽象类里面有抽象方法的话,子类要去继承该抽象类,那么就必须重写其抽象方法

abstract class Animal {
  eat(); //抽象方法 在抽象类里面定义的方法在子类里必须实现,如果不在子类里重写的话子类会报错
  run();
  printInfo() {
    print('我是一个抽象类里面的普通方法');
  }
}

class Dog extends Animal {
  @override
  eat() {
    print('小狗eat');
  }

  @override
  run() {
    print('小狗run');
  }
}

main() {
  Dog d = new Dog();
  d.eat(); //小狗eat
  d.printInfo(); //我是一个抽象类里面的普通方法
}

Dart中的多态:允许将子类类型的指针赋值给父类类型的指针,同一个函数调用会有不同的执行效果
子类的实例赋值给父类的引用
多态就是父类定义一个方法不去实现,让继承他的子类去实现,每个子类有不同的表现

abstract class Animal {
  eat(); //抽象方法
}

class Dog extends Animal {
  @override
  eat() {
    print('小狗eat');
  }
}

class Cat extends Animal {
  @override
  eat() {
    print('小猫eat');
  }
}

main() {
  Dog d = new Dog();
  d.eat(); //小狗eat

  Cat c = new Cat();
  c.eat(); //小猫eat
}

接口
和Java一样,dart也有接口,但是和Java还是有区别的。
首先,dart的接口没有interface关键字定义接口,而是普通类或抽象类都可以作为接口被实现。
同样使用implements关键字进行实现。
但是dart的接口有点奇怪,如果实现的类是普通类,会将普通类和抽象中的属性的方法全部需要覆写一遍。
而因为抽象类可以定义抽象方法,普通类不可以,所以一般如果要实现像Java接口那样的方式,一般会使用抽象类。
建议使用抽象类定义接口。

//例子:定义一个DB库 支持mysql mssql mongdb
//mysql mssql mongdb这三个类里面都有同样的方法

abstract class Db {
  // 当作接口 接口:就是约定 规范
  late String uri; //数据库的链接地址
  add(String data);
  save();
  delete();
}

class Mysql implements Db {
  @override
  late String uri;

  Mysql(this.uri);

  @override
  add(data) {
    print('这是mysql的add方法' + data);
  }

  @override
  delete() {
    // TODO: implement delete
    throw UnimplementedError();
  }

  @override
  save() {
    // TODO: implement save
    throw UnimplementedError();
  }
}

class Mssql implements Db {
  @override
  late String uri;

  @override
  add(String data) {
    print('这是MssqlMssql的add方法' + data);
  }

  @override
  delete() {
    // TODO: implement delete
    throw UnimplementedError();
  }

  @override
  save() {
    // TODO: implement save
    throw UnimplementedError();
  }
}

main() {
  //xxxxxxx-- 数据库地址
  Mysql mysql = new Mysql('xxxxxxx');
  mysql.add('12345');
}

mixins的中文意思是混入,就是在类中混入其他功能。

在Dart中可以使用mixins实现类似多继承的功能

因为mixins使用的条件,随着Dart版本一直在变,这里讲的是Dart2.x中使用mixins的条件:
1、作为mixins的类只能继承自Object,不能继承其他类
2、作为mixins的类不能有构造函数
3、一个类可以mixins多个mixins类
4、mixins绝不是继承,也不是接口,而是一种全新的特性

class A {
  String info = 'this is A';
  void printA() {
    print("A");
  }
}

class B {
  void printB() {
    print("B");
  }
}

class C with A, B {}

void main() {
  var c = new C();
  c.printA(); //A
  c.printB(); //B
  print(c.info); //this is A
}

猜你喜欢

转载自blog.csdn.net/m0_48259951/article/details/129315780