抽象类 abstract class
抽象类不能实例化,可以当做抽象类来 extends 也可以当做接口来 implements,dart 中没有 interface 这个关键字,接口也是抽象类实现的。
abstract class Animal {
speak(); // 抽象方法 必须实现
printInfo() { // 不需要实现
print('not abstract method');
}
}
class Dog extends Animal {
@override
speak() {
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 {
@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');
}
多接口
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();
}
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);
}