Flutter/Dart第17天:Dart类承继
Dart官方文档:https://dart.dev/language/extend
重要说明:本博客依据Dart官网文档,但并不是简略的对官网进行翻译,在掩盖中心功用状况下,我会依据个人研制经历,参加自己的一些扩展问题和场景验证。
类承继(extends/super)
Dart言语和Java言语相同,也是经过extends
关键字创立子类,经过super
关键字引证父类:
class Television {
void turnOn() {
_illuminateDisplay();
_activateIrSensor();
}
// ···
}
// `extends`承继父类
class SmartTelevision extends Television {
void turnOn() {
// `super`引证父类
super.turnOn();
_bootNetworkInterface();
_initializeMemory();
_upgradeApps();
}
// ···
}
成员重写(override)
子类能够重写父类的成员办法,包含操作符、getters和setters等。经过@override
注解标明重写父类的成员办法:
class Television {
// ···
set contrast(int value) {...}
}
class SmartTelevision extends Television {
@override
set contrast(num value) {...}
// ···
}
子类重写办法的声明有必要与父类被从头的办法相匹配,匹配的办法有以下几种:
- 回来类型有必要与重写办法的回来类型相同(或子类型)(如:父类办法回来类型是
num
,那么子类的回来类型有必要是num
或子类,如int
等)。 - 参数类型有必要与重写办法的参数类型相同(或超类型)(如:上诉代码样例,
SmartTelevision
子类的参数类型num
是父类int
的超类)。 - 方位参数的数量有必要相同(如:父类接纳3个方位参数,则子类有必要也是3个方位参数)。
- 泛型办法不能重写非泛型办法,反之也相同,非泛型办法不能重写泛型办法。
最佳实战:重写办法时,尽量防止缩写参数类型的规模,即尽量防止参数产生向下转化(如父类是num类型,而子类是int类型等),由于这样做可能会引发类型转化过错。当然,假如咱们确认不会产生过错,也能够这样做。
特别注意:当咱们重写了持平==
操作符,则有必要重写hashCode
的getter
办法:
class Person {
final String firstName, lastName;
Person(this.firstName, this.lastName);
// 重写 `hashCode` 获取办法
@override
int get hashCode => Object.hash(firstName, lastName);
// 重写 `==` 操作符
@override
bool operator ==(Object other) {
return other is Person &&
other.firstName == firstName &&
other.lastName == lastName;
}
}
void main() {
var p1 = Person('Bob', 'Smith');
var p2 = Person('Bob', 'Smith');
var p3 = 'not a person';
assert(p1.hashCode == p2.hashCode);
assert(p1 == p2);
assert(p1 != p3);
}
noSuchMethod()办法
若需要在拜访不存在的办法或实例变量时,咱们代码能做出呼应(而不是抛出NoSuchMethodError
过错),则咱们能够重写noSuchMethod()
办法:
class A {
// 重写`noSuchMethod`办法,防止`NoSuchMethodError`过错
@override
void noSuchMethod(Invocation invocation) {
print('You tried to use a non-existent member: '
'${invocation.memberName}');
}
}
在Dart言语中,除了以下几种状况外,咱们不可能调用一个不存在的办法(编译就犯错):
- 对象是
dynamic
动态类型,运行时才干确认详细类型。 - 对象是静态类型,存在未完成的办法,且它完成了
noSuchMethod()
办法(即它不是承继Object
类型的noSuchMethod()
办法)。
我的本博客原地址:https://ntopic.cn/p/2023102501