本节主要记录一下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
类),故运行结果输出Ba
Aa
Bb
Ab
C
D
-
继承与mixins是兼容的,如下demo中
R1
R2
类均继承类C
,同时支持MixinA
B
类
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,可以设计出同时带a
b
两个方法的抽象类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 {}