# 继承 extends
extends
关键字用于实现类之间的继承关系. 使用 extends
, 你可以创建一个新类, 它继承了另一个类的属性和方法. 这使得代码复用和扩展现有功能变得更加简单和直接.
# 实现继承
// 原始类
class Phone {
void startup(){
print("手机开机");
}
void shutdown(){
print("手机关机");
}
}
// 安卓手机继承手机
class AndroidPhone extends Phone{
void startup(){
print("安卓手机开机");
}
}
void main(List<String> args) {
var phone = AndroidPhone();
phone.startup();
phone.shutdown();
}
开机
关机
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
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
# 父类调用
// 原始类
class Phone {
void Hello(){
print('Hello Word');
}
void startup(){
print("手机开机");
}
void shutdown(){
print("手机关机");
}
}
// 安卓手机继承手机
class AndroidPhone extends Phone{
void startup(){
// 调用父类的方法
super.Hello();
print("安卓手机开机");
}
}
/// super 对象可以访问父类
void main(List<String> args) {
var phone = AndroidPhone();
phone.startup();
phone.shutdown();
}
Hello Word
安卓手机开机
手机关机
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
38
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
38
super 对象可以访问父类
# 调用父类构造
// 原始类
class Phone {
int number;
Phone(this.number);
void Hello(){
print('Hello ${number}');
}
void startup(){
print("手机开机");
}
void shutdown(){
print("手机关机");
}
}
// 安卓手机继承手机
class AndroidPhone extends Phone{
int code;
// 调用父类的构造函数
AndroidPhone(int number) : code = number,
super(number * 2 );
void startup(){
print("输入号码: ${code}");
super.Hello();
print("安卓手机开机");
}
}
/// 可调用父类的 构造函数
void main(List<String> args) {
var phone = AndroidPhone(123321);
phone.startup();
phone.shutdown();
}
输入号码: 123321
Hello 246624
安卓手机开机
手机关机
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
38
39
40
41
42
43
44
45
46
47
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
38
39
40
41
42
43
44
45
46
47
可调用父类的 构造函数
# 重写超类函数
class Mobile {
int number;
Mobile(this.number);
}
class AndroidPhone extends Mobile {
AndroidPhone(int number) : super(number);
// 没有这个方法运行的函数
void noSuchMethod(Invocation mirror) {
print('被重写 noSuchMethod');
}
}
/// 在重写的函数上加修饰符 @override
void main() {
dynamic p = AndroidPhone(12345678);
p.showNumber111();
}
被重写 noSuchMethod
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
在重写的函数上加修饰符
@override
# 继承抽象类的问题
abstract class IPhone {
void startup() {
print('开机');
}
// 下面方法推荐 用 接口方式 调用, 如果用继承方式它会报错,因为没有被实现
void shutdown();
}
class AndroidPhone extends IPhone {
void startup() {
super.startup();
print('AndroidPhone 开机');
}
void shutdown() {
// shutdown方法未被实现,是一个抽象方法,执行会报错
// super.shutdown();
print('AndroidPhone 关机');
}
}
void main() {
var p = AndroidPhone();
p.startup();
p.shutdown();
}
开机
AndroidPhone 开机
AndroidPhone 关机
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
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
抽象类中只定义抽象函数,实例化访问会报错
← 接口 interface with 多继承 →