本节主要记录一下Dart中关于类的使用
- 可调用的类
- 混合Mixins
可调用的类
如果 Dart 类实现了 call() 函数则可以当做方法来调用。
class Callable {
void call(int a, int b) {
print(a + b);
}
}
void main() {
Callable callable = Callable();
callable(10, 15);
}
运行结果为25,直接执行了call()方法
混合Mixins
- Mixins 是在多类继承中重用一个类代码的方法。
- 被Mixin(混入)的类不能有构造函数。
- 用法即为
with + 混入的类, 如下demo中类C有a、b与c三个方法。
class A {
void a() => print("Aa");
void b() => print("Ab");
}
class B {
void a() => print("Ba");
void b() => print("Bb");
}
class C with A, B {
void c() => print("C");
}
class D with B, A {
void d() => print("D");
}
void main() {
C c = C();
D d = D();
c.a();
d.a();
c.b();
d.b();
c.c();
d.d();
}
-
由于
A类与B类存在相同的方法a,具体执行则由最后混入的类确定(即B类),故运行结果输出BaAaBbAbCD -
继承与mixins是兼容的,如下demo中
R1R2类均继承类C,同时支持MixinAB类
class A {
void f() => print("A");
}
class B {
void f() => print("B");
}
class C {
void f() => print("C");
}
class R1 extends C with A, B {}
class R2 extends C with B, A {}
class R3 extends C with B, A {
@override
f() {
super.f();
}
}
void main() {
R1 r1 = R1();
R2 r2 = R2();
R3 r3 = R3();
r1.f();
r2.f();
r3.f();
}
运行结果为B A A
注:对比R2 R3类, f重写方法调用的super,实际调用并非父类C的方法(和想像的不一样)。
- Mixins弥补了接口和继承的不足(继承只支持单继承,而接口无法复用实现),可以多混入且能复用混入类的具体实现。
如下demo,可以设计出同时带
ab两个方法的抽象类D,同时无须像C类那样必须实现b方法
abstract class A {
void a();
}
abstract class B {
void b();
}
abstract class C extends A implements B {
@override
void b() => print("B");
}
abstract class D with A, B {}