ToB企服应用市场:ToB评测及商务社交产业平台

标题: Flutter/Dart第17天:Dart类继承 [打印本页]

作者: 莱莱    时间: 2023-11-17 04:31
标题: Flutter/Dart第17天:Dart类继承
Dart官方文档:https://dart.dev/language/extend
重要说明:本博客基于Dart官网文档,但并不是简单的对官网进行翻译,在覆盖核心功能情况下,我会根据个人研发经验,加入自己的一些扩展问题和场景验证。
类继承(extends/super)

Dart语言和Java语言一样,也是通过extends关键字创建子类,通过super关键字引用父类:
  1. class Television {
  2.   void turnOn() {
  3.     _illuminateDisplay();
  4.     _activateIrSensor();
  5.   }
  6.   // ···
  7. }
  8. // `extends`继承父类
  9. class SmartTelevision extends Television {
  10.   void turnOn() {
  11.     // `super`引用父类
  12.     super.turnOn();
  13.     _bootNetworkInterface();
  14.     _initializeMemory();
  15.     _upgradeApps();
  16.   }
  17.   // ···
  18. }
复制代码
成员重写(override)

子类可以重写父类的成员方法,包括操作符、getters和setters等。通过@override注解表明重写父类的成员方法:
  1. class Television {
  2.   // ···
  3.   set contrast(int value) {...}
  4. }
  5. class SmartTelevision extends Television {
  6.   @override
  7.   set contrast(num value) {...}
  8.   // ···
  9. }
复制代码
子类重写方法的申明必须与父类被重新的方法相匹配,匹配的方式有以下几种:
最佳实战:重写方法时,尽量避免缩写参数类型的范围,即尽量避免参数发生向下转换(如父类是num类型,而子类是int类型等),因为这样做可能会引发类型转换错误。当然,如果我们确定不会发生错误,也可以这样做。
特别注意:当我们重写了相等==操作符,则必须重写hashCode的getter方法:
  1. class Person {
  2.   final String firstName, lastName;
  3.   Person(this.firstName, this.lastName);
  4.   // 重写 `hashCode` 获取方法
  5.   @override
  6.   int get hashCode => Object.hash(firstName, lastName);
  7.   // 重写 `==` 操作符
  8.   @override
  9.   bool operator ==(Object other) {
  10.     return other is Person &&
  11.         other.firstName == firstName &&
  12.         other.lastName == lastName;
  13.   }
  14. }
  15. void main() {
  16.   var p1 = Person('Bob', 'Smith');
  17.   var p2 = Person('Bob', 'Smith');
  18.   var p3 = 'not a person';
  19.   assert(p1.hashCode == p2.hashCode);
  20.   assert(p1 == p2);
  21.   assert(p1 != p3);
  22. }
复制代码
noSuchMethod()方法

若需要在访问不存在的方法或实例变量时,我们代码能做出响应(而不是抛出NoSuchMethodError错误),则我们可以重写noSuchMethod()方法:
  1. class A {
  2.   // 重写`noSuchMethod`方法,避免`NoSuchMethodError`错误
  3.   @override
  4.   void noSuchMethod(Invocation invocation) {
  5.     print('You tried to use a non-existent member: '
  6.         '${invocation.memberName}');
  7.   }
  8. }
复制代码
在Dart语言中,除了以下几种情况外,我们不可能调用一个不存在的方法(编译就出错):
我的本博客原地址:https://ntopic.cn/p/2023102501

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4