# with 多继承

本文作者:阳九五 (opens new window)

本站地址:https://blog.56321654.xyz (opens new window)

Dart 提供了 with 关键字来实现类似于多继承的功能。with 关键字允许你将一个或多个混入(mixin (opens new window))应用到类定义中,从而为类添加额外的方法和属性。

混入是一种特殊类型的类,它只包含方法和属性的声明,没有构造函数和实例变量的实现。混入不能被实例化,只能被其他类使用 with 关键字组合。

# 多继承 with

// 定义手机
mixin Phone{
    void call(){
        print('这是手机');
    }
}

// 定义安卓
mixin Android{
    void playStore(){
        print('谷歌应用商店');
    }
}

// 定义苹果
mixin Ios{
    void appleStore(){
        print('苹果应用商店');
    }
}

// with 混入
class XiaoMi with Phone, Android, Ios {}

void main(List<String> args) {
    var p = XiaoMi();
    p.call();
    p.playStore();
    p.appleStore();
}

这是手机
谷歌应用商店
苹果应用商店
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

采用 with ... , .... , ... 方式 mixin 入多个类功能

# 函数重名冲突

// 定义手机
mixin Phone{
    void call(){
        print('这是手机');
    }
}

// 定义安卓
mixin Android{
    void call(){
        print('这是安卓手机');
    }
}

// 定义苹果
mixin Ios{
    void call(){
        print('这是苹果手机');
    }
}

// with 混入
class XiaoMi with Phone, Android, Ios {}

void main(List<String> args) {
    var p = XiaoMi();
    p.call();
}

这是苹果手机
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

可以发现后面的覆盖了前面的内容

# mixin不能有构造函数

// 定义手机
mixin Phone{
    // 此处报错
    Phone();
}

// with 混入
class XiaoMi with Phone {}

void main(List<String> args) {
    var p = XiaoMi();
}

Mixins can't declare constructors.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

mixin 中不能定义 constructor(构造函数)

# mixin on 限定条件

// 定义手机
mixin Phone{
    void call(){
        print('这是手机');
    }
}

// 定义Android 用 on 限定是 Phone
mixin Android on Phone{
    void playStore(){
        print('谷歌应用商店');
    }

    
    void call(){
        print('这是安卓手机');
    }
}

// with 混入时候,必须先 Phone 才行
class XiaoMi with Phone, Android {}

void main(List<String> args) {
    var p = XiaoMi();
    p.call();
    p.playStore();
}

这是安卓手机
谷歌应用商店


// 错误的混入
class XiaoMi with Android {}

'Android' can't be mixed onto 'Object' because 'Object' doesn't implement 'Phone'.
Try extending the class 'Android'.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
最近更新: 8/6/2025, 2:39:35 PM