不讲理论,代码实践

一、抽象类 abstract class

抽象类不能实例化,可以当做抽象类来 extends 也可以当做接口来 implements,dart 中没有 interface 这个关键字,接口也是抽象类实现的。

抽象类用作抽象类:

abstract class Animal {
  speak(); // 抽象方法  必须实现
  printInfo() {  // 不需要实现
    print('not abstract method');
  }
}

class Dog extends Animal {
  @override
  speak() {
    print('wang!');
  }
}

class Cat extends Animal {
  @override
  speak() {
    print('miao');
  }
  
}

void main() {
  print('---------抽象类------------');
  Dog d = new Dog();
  Cat c = new Cat();
  d.speak();
  d.printInfo();
  c.speak();
  c.printInfo();
}

输出结果:

2.jpg

一、接口

接口也是 abstrack 关键字声明的,并且需要使用 implements 关键字来实现.

代码示例:模拟一个数据库的基本接口,并且实现一个 Mysql 的类

abstract class DB {
  String host;
  String port;
  String user;
  String pass;
  query(String data);
  update(String data);
  insert(String data);
  delete(String data);
}

class Mysql implements DB {
  @override
  String host;

  @override
  String pass;

  @override
  String port;

  @override
  String user;

  Mysql(this.host, this.user, this.pass, [this.port = '3306']) {
    print(
        '[ok] connect to ${this.host}:${this.port}, use ${this.user}:${this.pass}');
  }

  @override
  delete(String data) {
    print('delete ${data}');
  }

  @override
  insert(String data) {
    print('insert ${data}');
  }

  @override
  query(String data) {
    print('query ${data}');
  }

  @override
  update(String data) {
    print('update ${data}');
  }
}

void main() {
  print('---------接口------------');
  Mysql my = new Mysql('127.0.0.1', 'root', '123456', '3307');
  my.insert('121');
  my.update('121');
  my.query('121');
  my.delete('121');
}

输出结果:

3.jpg

三、多接口

实例可以实现多个接口

abstract class A {
  fnA();
}

abstract class B {
  fnB();
}

class C implements A, B {
  @override
  fnA() {
    print('FN------A');
  }

  @override
  fnB() {
    print('FN------B');
  }
}

void main() {
  print('-----多接口------');
  print('-----dart 没有多继承------');
  C c = new C();
  c.fnA();
  c.fnB();
}

运行结果:

4.jpg

四、 mixin

因为没有多继承,因此如果要综合多个类属性和方法可以 implements 多个接口,如果不是抽象类,则可以通过 mixin 混入多个类的属性和方法。

class A {
  void fnA() {
    print('fnA');
  }

  void run() {
    print('runA');
  }
}

abstract class B {
  void fnB() {
    print('fnB');
  }

  void run() {
    print('runB');
  }
}

class C extends Object with A, B {
  void fnA() {
    print('C_fnA');
  }
}

/**
 * - mixin 类只能继承自 object
 * - mixin 类不能有构造函数
 * - 一个类能够 mixin 多个 mixin 类
  */
void main() {
  print('----- mixin ------');
  print('-----dart 没有多继承------');
  C c = new C();
  c.fnA();
  c.fnB();
  c.run();
  print('-----类型------');
  print(c is C);
  print(c is A);
  print(c is B);
}

输出结果:

5.jpg