抽象类 abstract class
抽象类不能实例化,可以当做抽象类来 extends 也可以当做接口来 implements,dart 中没有 interface 这个关键字,接口也是抽象类实现的。
abstract class Animal {speak(); // 抽象方法 必须实现printInfo() { // 不需要实现print('not abstract method');}}class Dog extends Animal {@overridespeak() {print('wang!');}}void main() {Dog d = new Dog();d.speak(); // wang!d.printInfo(); // not abstract method}
接口
接口也是 abstrack 关键字声明的,并且需要使用 implements 关键字来实现。
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 {@overrideString host;@overrideString pass;@overrideString port;@overrideString user;Mysql(this.host, this.user, this.pass, [this.port = '3306']) {print('[ok] connect to ${this.host}:${this.port}, use ${this.user}:${this.pass}');}@overridedelete(String data) {print('delete ${data}');}@overrideinsert(String data) {print('insert ${data}');}@overridequery(String data) {print('query ${data}');}@overrideupdate(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');}
多接口
abstract class A {fnA();}abstract class B {fnB();}class C implements A, B {@overridefnA() {print('FN------A');}@overridefnB() {print('FN------B');}}void main() {print('-----多接口------');print('-----dart 没有多继承------');C c = new C();c.fnA();c.fnB();}
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);}

