Dart 3.0 语法新特性 | 类型修饰符 Class modifiers

news2024/12/23 9:20:02

theme: cyanosis

在 dart 3.0.0 之后,对类型的修饰符进行了拓展,现在类型的修饰符有:

| 名称 | 作用 | | --- | --- | | mixin | 混入类修饰符 | | sealed | 密封可枚举的子类型 | | abstract | 抽象类修饰符 | | final | 一定程度上关闭派生能力 | | base | 基 | | interface | 接口 |


1. mixin 语法变化

在 dart 3.0.0 之前, 没有构造方法的 class 可以视为 mixin , 下面的代码是允许的:

``` class A {}

class C with A {} ```

在 dart 3.0.0 之后, mixin 变严格了,和 class 声明的常规类进行的区分,常规类将不被允许混入:

image.png

想要通过 with 关键字混入 A,需要通过 mixin 声明类:

``` mixin A {}

class C with A {} ```

或者通过 mixin 关键字对 class 进行修饰:

``` mixin class A {}

class C with A {} ```


也就是说,现在 Dart 中将 混入类常规类 进行了语法级别的区分:

mixin 声明定义了一个混入类,允许被通过 with 混入或 on 继承。
class 声明定义了一个常规类,允许被通过 extends 继承。
mixin class 声明定义了一个既可用作常规类又可用作混入类的类。即允许被通过 with 混入或 on 继承,又允许被通过 extends 继承。

  • 在新语法中只有 常规类 才允许使用 extendswith 子句,混入类不允许使用;
  • 只有 混入类 才允许使用 on 子句,常规类不允许使用。
  • mixin class 含有两者的血脉,所以即无法使用 extendswith 子句,也无法使用 on 子句。

image.png


2. 密封类的支持 sealed

有些类型的子类型集是已知的,可枚举的;比如登陆界面的认证状态 AuthState,有如下三种子状态

  • 认证中 AuthLoading
  • 认证成功 AuthSuccess
  • 认证失败 AuthFailure

这时就可以通过密封类来处理,下面的代码看起来似乎和平台的继承也没什么区别,但密封类有它的特点。

``` sealed class AuthState{} //创建密封类

class AuthLoading extends AuthState{}

class AuthSuccess extends AuthState{ final String user; final String token;

AuthSuccess(this.user, this.token); }

class AuthFailure extends AuthState{ final String error; AuthFailure(this.error); } ```


  • sealed 修饰的类自动是抽象类,无法被实例化。

image.png

  • sealed 修饰的类无法在外部被 继承 extended, 实现 implemented, 或 混入 with。

image.png

  • sealed 修饰的类可以被 switch 选择。
    如下所示,根据 AuthState 的不同状态,返回不同的字符串。在实际开发中可以返回不同的组件,在对应的分支中可以访问对应派生类中的字段。比如 AuthSuccess 分支中可以通过 state.user 访问用户名;AuthFailure 分支中可以通过 state.error 访问错误信息:

String buildByAuthState(AuthState state){ return switch(state){ AuthLoading()=> 'AuthLoading View', AuthSuccess()=> 'AuthSuccess View:${state.user}', AuthFailure()=> 'AuthFailure View:${state.error}', }; }

sealed 最大的特点是子类型可枚举,所以在编码过程中如果少写一个,编译器就是显示地给出提示。这样可以有效避免漏写的可能,这种从语法层面规避潜藏风险,对代码的健壮性是非常友好的。

image.png


3. final 类型修饰符

final 对类进行修饰,其目的是为了关闭该类的继承体系。如下所示,被 final 修饰的类无法被直接继承;

image.png

从提示中可以看出需要继承自 final 修饰的类,子类需要被 base 、final 或 sealed 修饰:

image.png

另外 final 修饰的类无法在外部进行派生:

image.png

从这两点就不难理解,final 修饰的类可以在一定程度上关闭派生能力。


4. base 和 interface 类修饰符

base 和 interface 在我看来是一对,base 是强调 继承 ; interface 是强调 实现 。两者的的目的是:

限制外部文件对修饰类的派生和实现。

base 修饰的类在外部 允许继承,不允许实现

image.png

interface 修饰的类在外部 不允许继承,允许实现

image.png


俗话说无规矩不成方圆,修饰符就是限制的规则,而接受限制就会享有更长远的利益。比如接受红绿灯的限制,会让整体的交通更加顺畅,减少拥堵,出事的可能性。而不是纠结于我多等了几十秒,不利于一时的享受。限制这是一种大局观,其目的是让整体更加有序。

类型修饰符的增加,可以让类本身多了一些特点,也可以控制类的派生能力,这对于构建大型应用来说是友好的。Kotlin 一直都有 sealed 密封类,这是让我垂涎的语法特性,现在 Dart 终于支持了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/531994.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《测试开发》测试启蒙

文章目录 测试是什么调试和测试的区别 什么是需求需求的定义需求的特征测试人员眼里的需求是什么如何深入了解需求 测试用例什么是测试用例为什么有测试用例 bug如何描述一个bug如何定义bug的级别bug的生命周期 软件测试的生命周期 👑作者主页:Java冰激凌…

理解神经网络的注意力机制(Attention)及PyTorch 实现

刚刚结束的 2022 年对于人工智能的许多进步来说是不可思议的一年。最近 AI 中的大多数著名地标都是由称为变形金刚的特定类别模型驱动的,无论是 chatGPT 的令人难以置信的进步,它席卷了世界,还是稳定的扩散,它为您的智能手机带来了类似科幻小说的功能。即使是 Tesla 的自动…

100种思维模型之联脑破界思维模型-64

前面我们分享过破界思维模型,即要不断打破固有认知边界,用变化的眼光看待一切事物的思维模型。 今天我们介绍一个破界方法的思维模型,一个告诉我们可通过联脑学习,打破独立大脑带来边界的思维模型。 01、何谓联脑破界思维模型 一…

crow-han(基于go-micro框架的微服务脚手架)-01-快速启动(简介、快速启动、接口测试)

文章目录 1. 简介1.1 包含内容1.2 swagger展示 2. 快速启动2.1 下载2.2 环境变量配置2.3 goland配置2.5 启动2.6 查看结果 3. swagger 接口测试3.1 url3.2 认证3.2.1 获取token3.2.2 Bearer 认证 3.3 测试接口(已创建用户为例) 1. 简介 一个基于go-micr…

测试4年,跳槽一次涨8k,我跳了3次···

最近有人说,现在测试岗位初始工资太低了,有些刚刚入行的程序员朋友说自己工资连5位数都没有.....干了好几年也没怎么涨。看看别人动辄月薪2-3万,其实我想说也没那么难。说下如何高效地拿到3w。 1.暂且把刚入行的条件设低些吧,大专…

大模型综述来了!一文带你理清全球AI巨头的大模型进化史

夕小瑶科技说 原创 作者 | 小戏,Python 如果自己是一个大模型的小白,第一眼看到 GPT、PaLm、LLaMA 这些单词的怪异组合会作何感想?假如再往深里入门,又看到 BERT、BART、RoBERTa、ELMo 这些奇奇怪怪的词一个接一个蹦出来&#xf…

python list 逆序的方法

在 Python中,使用 list作为基本的数据类型是非常方便的,也是 Python中最常见的数据结构之一。那么对于 list进行逆序操作时,我们应该怎么做呢?下面就一起来看看吧。 首先要注意,在使用 list逆序时,它会自动…

【Java】EasyExecl数据导入

【Java】EasyExecl数据导入 📔 千寻简笔记介绍 千寻简笔记已开源,Gitee与GitHub搜索chihiro-notes,包含笔记源文件.md,以及PDF版本方便阅读,且是用了精美主题,阅读体验更佳,如果文章对你有帮助…

视频格式、视频方式区别、一个视频播放的全过程

一:直播和点播的区别及有的格式 1:视频直播的播放内容是媒体直播流的形式,不存在物理文件,视频画面和声音信息都是实时采集、传输和播放的。如果没有录制模块,视频画面和声音播放完毕就消失了,不能提供二次…

并行分布式计算 并行计算性能评测

文章目录 并行分布式计算 并行计算性能评测基本性能指标参数CPU 基本性能指标存储器性能并行与存储开销 加速比性能定律Amdahl 定律Gustafson 定律Sun 和 Ni 定律加速比讨论 可括放性评测标准等效率度量标准等速度度量标准平均延迟度量标准 基准评测程序(Benchmark&…

甘特图控件DHTMLX Gantt入门使用教程【引入】:用Node.js实现Gantt(下)

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的大部分开发需求,具备完善的甘特图图表库,功能强大,价格便宜,提供丰富而灵活的JavaScript API接口,与各种服务器端技术&am…

Linux多路转接之select

文章目录 一、IO的理解二、五种IO模型1.阻塞式IO2.非阻塞式IO3.信号驱动式IO4.IO多路转接5.异步IO6.五种IO模型的总结 三、非阻塞式IO1.fcntl函数 四、IO多路转接之select的介绍五、编写select服务器1.将获取连接时设置为select多路转接2.获取连接成功后的读取数据 六、select多…

商家订单之Java版SpringCloud+SpringBoot+Mybatis+Vue+Uniapp 分布式、微服务、多商家入驻b2b2c电子商务云平台

一个好的SpringCloudSpringBoot b2b2c 电子商务平台涉及哪些技术、运营方案?以下是我结合公司的产品做的总结,希望可以帮助到大家! 搜索体验小程序:海哇 1. 涉及平台 平台管理、商家端(PC端、手机端)、买…

linu0.12-9-blk_drv

[394页] 第9章 块设备驱动程序 395–9-1-总体功能 395–9-1-1-块设备请求项和请求队列 397–9-1-2-块设备访问调度处理 397–9-1-3-块设备操作方式 398–9-2-blk.h文件 398–9-2-1-功能描述 399–9-2-2-代码注释 403–9-3-hd.c程序 403–9-3-1-功能描述 405–9-3-2-代码注释…

离散数学_九章:关系(6)

🪐9.6 偏序 1、⛺偏序关系和偏序集⛲偏序关系⛲偏序(关系)的例子 a. “大于或等于” 关系b. “整除” 关系c. “包含” 关系 🎬偏序集🎬可比性(comparability) " ≼ " 符号a. 可比 &a…

【工具】如何判断两个二进制文件是否相同

🐚作者简介:花神庙码农(专注于Linux、WLAN、TCP/IP、Python等技术方向)🐳博客主页:花神庙码农 ,地址:https://blog.csdn.net/qxhgd🌐系列专栏:善假于物&#…

wx自定义组件

自定义组件的意义: 提供一系列的样式,,通用的样式提供一系列的骨架,,通用标签避免重复写一些业务逻辑 小程序自定义组件中 : slot : 修改组件内容 外部样式类: 修改组件样式 slot…

案例7:Java茶叶销售网站设计与实现开题报告

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

手术麻醉信息管理系统源码(简称手麻系统源码)php + mysql + vue2 B/S网页版

手术麻醉信息管理系统源码(简称手麻系统源码) 手术麻醉信息管理系统(简称手麻系统)是指专用于住院患者手术与麻醉的申请、审批、安排,术前、术中和术后有关信息的记录和跟踪以及手术麻醉室内部管理等功能的计算机应用…