05-6.类库-继承 extends
·
一、实现继承
- 任何类都能被继承;
- 继承不用重写字段;
- 继承不需要重写父类的所有方法。
class Phone {
void startup() {
print('开机');
}
void shutdown() {
print('关机');
}
}
class AndroidPhone extends Phone {
}
void main() {
var p = AndroidPhone();
p.startup();
p.shutdown();
}
开机
关机
二、超类
超类,即父类,在子类中,可以用super代表父类,去调用父类的方法和字段。
1.调用超类的方法
(1).继承普通的类
class Phone {
void startup() {
print('开机');
}
void shutdown() {
print('关机');
}
}
class AndroidPhone extends Phone {
@override
void startup() {
super.startup();
print('AndroidPhone 开机');
}
}
void main() {
var p = AndroidPhone();
p.startup();
}
开机
AndroidPhone 开机
(2).继承抽象类
继承抽象类,如果在子类中调用了父类的抽象方法(未实现),则会报错,提示该方法在超类型中始终是抽象的。
abstract class Mobile {
int number;
Mobile(this.number);
void showNumber() ;
}
class AndroidPhone extends Mobile {
AndroidPhone(super.number);
@override
void showNumber() {
super.showNumber();//调用了超类的抽象方法,会报错。
print('010-$number');
}
@override
noSuchMethod(Invocation invocation) {
print("没有该方法");
}
}
2.调用超类的构造函数
- 继承时,字段不用重写;
- 继承父类时,如果没有显示的调用父类的构造函数,那么就会默认的去调用父类的无参构造,如果父类有包含参数的构造函数,则去调用父类的无参构造就会调用失败。
(1).普通调用
class Mobile {
int number;
Mobile(this.number);
void showNumber() {
print('010-$number');
}
}
class AndroidPhone extends Mobile {
AndroidPhone(int number) : super(number);
- AndroidPhone(int number):初始化形式参数 ,把你传进来的参数赋给 AndroidPhone自己的字段number;
- super(number):在初始化列表里调用父类构造函数,把你传进来的参数赋给父类Mobile的字段number;
(2).超级参数(推荐写法)
class Mobile {
int number;
Mobile(this.number);
void showNumber() {
print('010-$number');
}
}
class AndroidPhone extends Mobile {
AndroidPhone(super.number);
}
3.重写超类函数
class Mobile {
int number;
Mobile(this.number);
}
class AndroidPhone extends Mobile {
AndroidPhone(int number) : super(number);
@override
void noSuchMethod(Invocation mirror) {
print('被重写 noSuchMethod');
}
}
void main() {
dynamic p = AndroidPhone(12345678);
p.showNumber111();
}
被重写 noSuchMethod
3.重写超类的函数
class Mobile {
int number;
Mobile(this.number);
}
class AndroidPhone extends Mobile {
AndroidPhone(int number) : super(number);
@override
void noSuchMethod(Invocation mirror) {
print('被重写 noSuchMethod');
}
}
void main() {
dynamic p = AndroidPhone(12345678);
p.foo();
}
被重写 noSuchMethod
noSuchMethod(Invocation invocation):
- 是 Dart 的“兜底拦截”机制: 当对象被调用了一个不存在的方法/属性(或调用方式不匹配)时,有机会进入这个方法 。
- 在 强类型 下,直接写 p.foo() 通常会在编译/分析阶段就报错,根本到不了运行时;用 dynamic (或反射/某些代理场景)才更容易触发 noSuchMethod 。
更多推荐
所有评论(0)