首页 > 其他分享 >Flutter/Dart第17天:Dart类继承

Flutter/Dart第17天:Dart类继承

时间:2023-10-25 21:55:33浏览次数:32  
标签:17 重写 Dart 子类 类型 父类 方法 Flutter

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


标签:17,重写,Dart,子类,类型,父类,方法,Flutter
From: https://www.cnblogs.com/obullxl/p/NTopic2023102501.html

相关文章

  • Flutter学习资料
    Flutter安装和文档Flutter控件学习FlutterAPP代码结构检测flutter界面元素 Flutter常用插件:flutterdartgetX:  FlutterGetX使用---简洁的魅力JsonToDart(JSONToDart) flutter常用第三方框架: 库功能dio网络框架shared_preferences......
  • A piece of code for loading and caching Skeleton Animation in IO task [Cocos2dx.
    /****************************************************************************Copyright(c)2017-2018XiamenYajiSoftwareCo.,Ltd.http://www.cocos2d-x.orgPermissionisherebygranted,freeofcharge,toanypersonobtainingacopyofthissoft......
  • CF1777D题解
    分析首先看到那个\(10^{100}\)再加上样例,我们就能意识到在不是特别多的操作次数后这颗树上的值就会全变成\(0\)。因为没有子节点在一次操作后显然就会变成\(0\),然后第一次叶节点就会变成\(0\),然后下一次子节点中只有叶节点的就会变成\(0\),以此类推,理论上最多操作\(n\)......
  • Flutter/Dart第16天:Dart类方法
    Dart官方文档:https://dart.dev/language/methods重要说明:本博客基于Dart官网文档,但并不是简单的对官网进行翻译,在覆盖核心功能情况下,我会根据个人研发经验,加入自己的一些扩展问题和场景验证。实例方法实例方法就是在类中定义的函数。对象的实例方法可访问this实例和实例变量。......
  • CF1777C题解
    分析看到题面里面的子序列觉得很恶心,如果是子段感觉就会比较好做。如果直接填上子序列中间的空隙就可能会取一些比必须要取的数更大或者更小的数,影响我们的答案。那么就可以直接排序,使得子序列中间的空隙的数必然\(\geq\)左端且\(\leq\)右端,不会影响我们的答案(因为极差只......
  • CF1777A题解
    分析发现操作2不会改变数的奇偶性,故无视。那么操作就是单纯删一个数。对于一个连续出现\(x\)个奇偶性相同的数的序列,需要删\(x-1\)个数(因为只剩下一个数就不会和相邻的数奇偶性相同了)。觉得找序列太麻烦,观察到连续出现\(x\)个奇偶性相同的数的序列有\(x-1\)个不......
  • [ABC176F] Brave CHAIN
    [ABC176F]BraveCHAIN洛谷:[ABC176F]BraveCHAINAtcoder:[ABC176F]BraveCHAINProblemhhoppitree有\(3n\)张卡片,其中每张卡片上都写着\(1\simn\)中的一个数,他会重复以下操作\(n-1\)次:将最左侧的\(5\)张牌任意排列,排列后,删去最左侧的\(3\)张牌,如果这三张牌上写......
  • CSP20230917-3 梯度求解 题解
    〇、题目太长了懒得写。简单来说就是求对于一个后缀表达式,每个询问给出一个下标和一些值,求以该下标变量为自变量其它变量为常数时的偏导数。一、思路考虑直接对于表达式建出表达式树。建树的过程比较直接:每次栈里面放节点编号,遇到符号就取出当前栈顶两个节点作为子节点。每......
  • CF1710 题解
    CF1710题解A看图写话。想象一个格子以及周围同色格的颜色必须呈一个三叉的形状:################这些三叉拼起来最小的形状,就是两个以上的整行,或整列。所以遍历每一种颜色,通过整......
  • 【题解】CF1710 合集
    CF1710AColorthePicture标签:思维题\(C^-\)典型的有图有真相,嘻嘻(抽风了?显然有一个结论,我们颜色要么一行一行天,要么一列一列填。并且填进去的颜色必须不少于两行/列然后就是记一个ans和一个over表示如果每个颜色都两行/列填进去能填的最多列数,以及两行/列填进去后还能......