当前位置:首页 > 后端开发 > 正文内容

Flutter/Dart第17天:Dart类承继

邻居的猫1个月前 (12-09)后端开发531

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类型等),由于这样做可能会引发类型转化过错。当然,假如咱们确认不会产生过错,也能够这样做。

特别注意:当咱们重写了持平==操作符,则有必要重写hashCodegetter办法:

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


扫描二维码推送至手机访问。

版权声明:本文由51Blog发布,如需转载请注明出处。

本文链接:https://www.51blog.vip/?id=265

分享给朋友:

“Flutter/Dart第17天:Dart类承继” 的相关文章

Python 潮流周刊#79:Python 的元数据窘境(摘要)

Python 潮流周刊#79:Python 的元数据窘境(摘要)

本周刊由 Python猫 出品,精心选择国内外的 250+ 信息源,为你选择最值得共享的文章、教程、开源项目、软件东西、播客和视频、抢手话题等内容。愿景:协助一切读者精进 Python 技能,并增加工作和副业的收入。 共享了 12 篇文章,12 个开源项目,2 则抢手评论,全文 2200 字。 以下...

CORDIC算法解说及verilog HDL完成(圆坐标系)

CORDIC算法解说及verilog HDL完成(圆坐标系)

CORDIC算法原理论述 CORDIC(Coordinate Rotation Digital Computer)算法,即坐标旋转数字核算方法,是J.D.Volder1于1959年初次提出,首要用于三角函数、双曲线、指数、对数的核算。 伪旋转 在笛卡尔坐标平面(下方左图)由 \(({x_1},{y_...

c语言数组定义和赋值,C语言数组定义与赋值详解

c语言数组定义和赋值,C语言数组定义与赋值详解

定义数组 一维数组```c// 定义一个整型数组,包含10个元素int arr;``` 二维数组```c// 定义一个整型二维数组,包含3行4列int matrix;``` 初始化数组 一维数组```c// 初始化一个整型数组int arr = {1, 2, 3, 4, 5};``` 二维数组``...

Python网址,python官网免费下载

Python网址,python官网免费下载

以下是关于Python的一些重要网址信息,包括官方网站、教程网站和社区网站: Python 官方网站 Python 官方网站: 提供Python源代码和安装程序下载,最新版本为Python 3.13.1。 包含Python标准库的文档、教程和指南,可以在线获取。 Python 教程网站 Py...

go英语怎么读,Go英语单词的正确发音与用法解析

1. 动词“去”(to go): 作为一般现在时,主语是第三人称单数时(如 he she it),读音为 /g?/。 其他情况下,读音为 /go?/。2. 名词“围棋”(a board game): 在这个词组中,go 读音为 /ɡo?/。3. 名词“能,行”(permission...

php架构, 系统架构概述

php架构, 系统架构概述

2. 三层架构:三层架构是将应用程序分为表现层、业务逻辑层和数据访问层。表现层负责与用户交互,业务逻辑层处理应用程序的核心功能,数据访问层负责与数据库交互。3. 依赖注入(DI):依赖注入是一种设计模式,它允许在运行时动态地将依赖项注入到对象中。这有助于减少代码耦合,提高代码的可测试性和可维护性。4...