Flutter/Dart第17天:Dart类继承
1.SpringBoot与MyBatis零XML配置集成和集成测试2.Maven多模块项目架构配置介绍和实战3.SpringBoot如何让业务Bean优先于其他Bean加载4.Flutter/Dart第01天:Dart安装和初体验5.Flutter/Dart第02天:Dart基础语法(建议收藏)6.Flutter/Dart第03天:Dart可迭代集合7.Flutter/Dart第04天:Dart异步编程(Future和async/await)8.Flutter/Dart第05天:Dart特殊特性Mixin详解9.Flutter/Dart第06天:Dart基础语法详解(变量)10.Flutter/Dart第07天:Dart基础语法详解(库、导入和关键字)11.Flutter/Dart第08天:Dart类型(内置类型、记录、集合、泛型和类型别名)12.Flutter/Dart第09天:Dart高级特性Pattern模式的概览和用法13.Flutter/Dart第10天:Dart高级特性Pattern模式的全部类型(共15种)14.Flutter/Dart第11天:Dart函数方法详解15.Flutter/Dart第12天:Dart控制流详解16.Flutter/Dart第13天:Dart错误处理17.Mac电脑80端口被占用的2种解决办法18.Flutter/Dart第14天:Dart类详解19.Flutter/Dart第15天:Dart类构造函数20.Flutter/Dart第16天:Dart类方法
21.Flutter/Dart第17天:Dart类继承
22.Flutter/Dart第18天:Dart特性之可调用对象23.Flutter/Dart第19天:Dart高级特性之扩展方法(Extension methods)24.Flutter/Dart第20天:Dart 3.0新特性之类型修饰符25.Flutter/Dart第21天:Dart异步编程(Future/Stream)26.FlutterApp实战·第01天:Flutter安装和配置27.Python深入理解*和**含义和应用28.[每日AI·0430]首个自主更新的多模态大模型,马斯克访华,文本一键转3D数字人骨骼动画,创新的虚拟试衣模型29.国内免费的AI工具出色地帮我辅导女儿的小学英语作业30.[每日AI·0506]巴菲特谈 AI,李飞飞创业,苹果或将推出 AI 功能,ChatGPT 版搜索引擎31.玩转AI,笔记本电脑安装属于自己的Llama 3 8B大模型和对话客户端32.一文彻底整明白,基于Ollama工具的LLM大语言模型Web可视化对话机器人部署指南33.基于Llama 3搭建中文版(Llama3-Chinese-Chat)大模型对话聊天机器人34.Python游戏编程:一步步用Python打造经典贪吃蛇小游戏35.借助AI大模型,三分钟原创一部儿童故事短视频(附完整操作步骤)36.[AI资讯·0531] 达摩院医疗AI新里程碑,OpenAI价值数十亿美元,微软投资130亿美元,百度文库成为一站式AI内容获取与创作平台,三大运营商完成AI产品市场,AI获得成功PMF需多次尝试……37.ngrok内网穿透,实现外网访问ChatTTS/Qwen2等大模型应用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
本文作者:奔跑的蜗牛,转载请注明原文链接:https://ntopic.cn
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
· 我们是如何解决abp身上的几个痛点
· 普通人也能轻松掌握的20个DeepSeek高频提示词(2025版)
· DeepSeek+Zotero