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

Flutter/Dart第20天:Dart 3.0新特性之类型修饰符

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

Dart官方文档:https://dart.dev/language/class-modifiers

重要说明:本博客依据Dart官网文档,但并不是简略的对官网进行翻译,在掩盖中心功用状况下,我会依据个人研制经历,参加自己的一些扩展问题和场景验证。

类型润饰符主要是操控类或许Mixin怎么被运用,包括在库内部和外部运用。润饰符关键字出现在类型或Mixin声明的前面,如abstract class经过abstract润饰符界说了一个笼统类。

可用于声明类的润饰符关键字列表如下:

  • abstract
  • base
  • final
  • interface
  • sealed
  • mixin

束缚:上面的润饰符列表,只要base能用于Mixin类型;一起,上诉润饰符不能用于包括enumtypedefextension等类型声明。

实战:当咱们决议要运用润饰符时,或许需求考虑一下类的预期用处和类需求供给哪些行为。

无润饰符

当咱们界说类或许Mixin时,不期望对结构函数或许子类进行束缚时,咱们能够不运用润饰符。

当类或许Mixin没有润饰符时,默许状况下,能够对这些类或许Mixin进行以下操作:

  • 经过结构函数创立类实例
  • 经过承继类来创立子类
  • 完成类或许Mixin的接口
  • 混入Mixin或许Mixin类

abstract润饰符(笼统类)

运用场景:当咱们界说了一个类(即:笼统类),但又没有完好地完成了它一切的接口时运用(和Java言语相同),请运用abstract润饰符。

束缚:笼统类不能被实例化;一般状况,笼统类都包括笼统办法。

// 笼统类
abstract class Vehicle {
  void moveForward(int meters);
}

// 完成类
class MockVehicle implements Vehicle {
  @override
  void moveForward(int meters) {
    // ...
  }
}

base润饰符(基类)

运用场景:当咱们用base润饰符界说了一个类或许Mixin时(即:基类),那么这个基类的完成只能基类地点库内。这样做的意图:

  • 每逢创立子类实例时,基类的结构函数被调用
  • 一切现已完成的私有成员都在子类中
  • 在基类中新添加的成员会被一切子类承继(除非:子类中声明晰同名的成员但并不兼容的签名。如:子类声明晰同名办法,可是办法入参或许回来结果与基类不兼容)

实战:为了确保基类不会被损坏,子类有必要运用basefinal或许sealed润饰符。

如下代码样例,基类能够实例化、被承继,可是不能被完成:

// 基类
base class Vehicle {
  void moveForward(int meters) {
    // ...
  }
}

// 1. 实例化
Vehicle myVehicle = Vehicle();

// 2. 被承继
base class Car extends Vehicle {
  int passengers = 4;
  // ...
}

// 3. ERROR:不能被完成
base class MockVehicle implements Vehicle {
  @override
  void moveForward() {
    // ...
  }
}

interface润饰符(接口类)

运用场景:运用interface润饰符界说一个接口。接口能够被外部库完成,可是不能被承继。这样做的意图:

  • 当类的一个实例办法运用this调用另一个实例办法时,它总是调用同一个库的实例办法
  • 为了防止不行预期的办法调用,其他库不能从头接口已有的办法

如下代码样例,接口类能够实例化、被完成,可是不能被承继:

// a.dart 接口类
interface class Vehicle {
  void moveForward(int meters) {
    // ...
  }
}

//
// b.dart
//
import 'a.dart';

// 1. 实例化
Vehicle myVehicle = Vehicle();

// 2. 被完成
class MockVehicle implements Vehicle {
  @override
  void moveForward(int meters) {
    // ...
  }
}

// 3. ERROR: 不能被承继
class Car extends Vehicle {
  int passengers = 4;
  // ...
}

abstrace interface(笼统接口类)

一般状况下,咱们运用interface来界说朴实接口。

当咱们运用abstract interface class组合润饰符时,能够界说一个笼统接口类:它即有接口类的功用(可被完成,但不能被承继),也有笼统类的功用(有笼统成员)。

final润饰符(不行变类)

运用场景:当运用final润饰符时,表明该类不能被其他库承继和完成(和Java还有点不相同)。这样做的意图:

  • 能够安全地进行API改变
  • 该类不会被第三方子类掩盖,因而能够定心调用实例办法

束缚:final不行变类能够在本库中被承继和完成,final润饰符包括了base润饰符特性,因而,子类有必要运用basefinal或许sealed润饰符。

// a.dart 接口类
final class Vehicle {
  void moveForward(int meters) {
    // ...
  }
}

//
// b.dart
//
import 'a.dart';

// 1. 实例化
Vehicle myVehicle = Vehicle();

// 2. ERROR: 不能被承继
class Car extends Vehicle {
  int passengers = 4;
  // ...
}

class MockVehicle implements Vehicle {
  // 3. ERROR: 不能被完成
  @override
  void moveForward(int meters) {
    // ...
  }
}

sealed润饰符(密封类)

运用场景:当咱们界说了一个类(即:密封类),且清晰该类的一切子类集合时,请运用sealed润饰符。这答应咱们经过switch穷举一切的子类型。

束缚:sealed润饰的类,制止被其他库承继或许完成,它隐含abstract润饰符:

  • 不能被实例化
  • 能够有工厂结构函数
  • 能够界说结构函数,子类可直接运用
  • 子类并不是abstract笼统类

编译器能够知道一切sealed润饰符类的子类(由于他们在同一个库中),这样在switch中,如未穷举,编译器能宣布过错正告!

// 密封类
sealed class Vehicle {}

class Car extends Vehicle {}

class Truck implements Vehicle {}

class Bicycle extends Vehicle {}

// 1. ERROR: 不能被实例化
Vehicle myVehicle = Vehicle();

// 2. 子类能够被实例化
Vehicle myCar = Car();

String getVehicleSound(Vehicle vehicle) {
  // 3. ERROR: switch中子类未穷举(还有Bicycle子类)
  return switch (vehicle) {
    Car() => 'vroom',
    Truck() => 'VROOOOMM',
  };
}

switch中,假如咱们不想穷举sealed类的子类;又或许今后还会添加子类,但又不想损坏API规划,我也能够运用final润饰符。关于finalsealed润饰符的深化比较,请稍等本博客的下一个博客介绍(请容许我卖个关子!)。

组合润饰符

经过组合润饰符,能够起到叠加束缚作用。咱们声明类时,依照次序,能够叠加的润饰符:

  • 可选的abstract润饰符:类包括笼统成员,且不能被实例化
  • 可选的baseinterfacefinalsealed润饰符:束缚其他库的子类型
  • 可选的mixin润饰符:类是否可被混入
  • 必选的class类关键字

部分润饰符是不能组合运用,由于他们或许剩余或许对立互斥:

  • abstract润饰符和sealed润饰符:原因是sealed隐含了abstract润饰符
  • interfacefinalsealed润饰符和mixin润饰符:原因是这些润饰符都制止被混入

完好的有用的润饰符组合列表如下:

image


我的本博客原地址:https://ntopic.cn/p/2023110501


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

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

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

分享给朋友:

“Flutter/Dart第20天:Dart 3.0新特性之类型修饰符” 的相关文章

【日记】新看的书有点难 QvQ(563 字)

【日记】新看的书有点难 QvQ(563 字)

正文   我以为简历投递的截止时刻是 28 号。成果今日不放心又去点了一下投递,发现现已过截止时刻了。也便是说——昨日我在截止时刻前 2 分钟把简历投了出去。而那个时分我以为至少还有 2 天时刻……   社招,我感觉期望不大,而且投出去的时刻太晚了,估量后边的人都不会看了。筛都不必定会筛到我这来。只...

C语言编程软件,助力编程学习与开发

C语言编程软件,助力编程学习与开发

1. Visual Studio Code:这是一款轻量级但功能强大的源代码编辑器,支持多种编程语言,包括C语言。它具有丰富的扩展插件,可以轻松实现代码高亮、代码提示、调试等功能。适用于Windows、macOS和Linux系统。2. Eclipse:Eclipse是一个开源的集成开发环境(IDE)...

php一句话,php官网

请提供具体的上下文或问题,以便我能提供相关的PHP代码示例。深入解析PHP一句话木马:原理、构造与免杀技巧一、PHP一句话木马原理PHP一句话木马,顾名思义,就是只需要一行代码就能实现攻击目的的木马。其核心原理是利用PHP中的eval()函数。eval()函数可以将字符串当作PHP代码执行,从而实现...

php文件用什么软件打开,选择合适的软件

php文件用什么软件打开,选择合适的软件

1. 文本编辑器: Notepad :一款流行的免费文本和源代码编辑器,支持多种编程语言,包括PHP。 Sublime Text:一个轻量级的文本编辑器,以其高性能和可定制性而受到欢迎。 Visual Studio Code:由Microsoft开发的一款免费源代码编辑器,功能强...

r语言apply函数用法,什么是apply函数?

`apply` 函数是 R 语言中的一个强大工具,它允许用户对矩阵或数据框的行或列应用一个函数。`apply` 函数可以大大简化对矩阵或数据框的操作,尤其是在进行矩阵运算时。下面是 `apply` 函数的基本用法: 基本语法```Rapply``` `X`: 需要处理的矩阵或数据框。 `MARGIN...

b rust,性能与安全的完美结合

B树是一种自平衡的树数据结构,它维持数据有序,并且允许搜索、顺序访问、插入和删除操作都在对数时间内完成。Rust是一种系统编程语言,以其内存安全性和高性能著称。在Rust中实现B树是一个很好的练习,可以帮助你理解数据结构和Rust语言的特性。以下是一个简单的B树实现的示例代码:```rustuse...