Dart-Tour2-类
类
Dart语法样式: https://www.dartlang.org/guides/language/effective-dart/style
语法:https://www.dartlang.org/guides/language/language-tour
概览
- 重要概念
- 关键词
- 注释
- 变量
- 内置类型
- 函数
- 操作符
- 流程
- 异常
- 类
- 泛型
- 库
- 异步
- 发电机
- 可调用的类
- 分离
- 类型定义
- 元数据
Dart是一种具有类和基于mixin的继承的面向对象语言。每个对象
都是一个类的实例
,所有类都来自Object
。
基于Mixin的继承意味着虽然每个类(除了Object)只有一个超类,但是类体可以在多个类层次结构中重用。
特点:当最左边的操作数为null
时,使用?.
而不是.
避免异常:
构造函数
1 |
class { |
默认构造函数
如果未声明构造函数,则会为您提供默认构造函数。默认构造函数没有参数,并在超类中调用无参数构造函数。
构造函数不是继承的
子类不从其超类继承构造函数。没有声明构造函数的子类只有默认(无参数,无名称)构造函数。
命名构造函数(多构造函数)
1 |
// 命名构造函数:origin |
注意:构造函数不是继承的,这意味着超类的命名构造函数不会被子类继承。如果希望使用超类中定义的命名构造函数创建子类,则必须在子类中实现该构造函数。
一个完整的多构造函数写法:
1 |
class { num x,y; // 原始写法 |
调用
1 |
void classAboutMethod(){ var pointOrigin = Point(34,67); |
结果为:
1 |
34 |
调用非默认的超类构造函数
执行顺序如下:
- 初始化列表
- 超类的无参数构造函数
- 主类的无参数构造函数
初始化列表
重定向构造函数
有时构造函数的唯一目的是重定向
到同一个类中的另一个构造函数
。重定向构造函数
的主体是空的
,构造函数调用出现在冒号(:)之后。
1 |
class { num x,y; Point(this.x, this.y); Point.alongX(num x) : this(x,0); } |
调用:
1 |
var pointAlongX = Point.alongX(11); |
结果为:
1 |
11 |
常量构造函数
如果你想使你的类生成永远不会更改的对象
,则可以使这些对象成为编译时常量
。为此,请 定义 const构造函数
并 确保 所有实例变量
都是final
。
1 |
class ImmutablePoint { |
工厂建设者
在不需要总是创建新的实例的情况下可以使用 factory
关键字,例如下面这个例子表示:从缓存中返回对象的构造函数:
注意:工厂构造函数无权访问this。
1 |
class { num x,y; Point.alongX(num x) : this(x,0); static final Map<String, Point> _cache = Map<String, Point>{}; factory Point.name(String name){ |
调用:
1 |
var pointName = Point.name('Alice'); |
结果:
1 |
477440163 |
使用class成员
- 使用
.
来引用实例变量或方法
1 |
var pointOrigin = Point(34,67); |
- 当
最左边
的操作数为null
时,使用?.
而不是.
避免异常:
1 |
// 如果pointAbout不为空,那么设置x = 4; |
使用构造函数
一般情况
1 |
var pointOrigin = Point(34,67); |
注意:在Dart2中,new
是可选关键字。
常量构造函数
有些类提供常量构造函数
。要使用常量构造函数创建编译时常量,请将const
关键字放在构造函数
名称之前
:
1 |
var p = const ImmutablePoint(2, 2); |
如果构造2个相同
的编译时常量
,那么结果是:产生同一个
规范的实例:
1 |
var a = const ImmutablePoint(1, 1); |
在常量上下文中,您可以省略
const构造函数或文字之前的内容。例如,查看此代码,该代码创建一个const映射:
1 |
const pointAndLine = const { |
那么,除了第一次出现的const
外其他所有的const
关键字都可以省略。简写为:
1 |
// Only one const, which establishes the constant context. |
如果常量构造函数在常量上下文之外
并且在没有const
的情况下调用,则会创建一个非
常量对象:
1 |
var a = const ImmutablePoint(1, 1); // Creates a constant |
获取对象的类型
要在运行时获取对象的类型,可以使用Object
的runtimeType
属性,该属性返回
一个Type对象
。
1 |
var pointAboutVal = Point.withVal(11, 21); |
结果为:
1 |
the type of pointAboutVal is Point |
实例变量
以下是 声明 实例变量的方法:
1 |
class { |
所有未初始化
的实例变量都具有该值null
。
所有实例变量都生成一个隐式getter方法
。非final实例变量也会生成隐式setter方法
。有关详细信息,请参阅Getters和setter。
1 |
class Point { |
如果初始化声明它的实例变量(而不是构造函数或方法),则在创建实例时设置该值,该实例在构造函数及其初始化列表执行之前。
方法
方法是为对象提供行为的函数。
实例方法
对象的实例方法可以访问实例变量和this。
getters and setters
抽象方法
实例、getter和setter方法可以是抽象的,定义一个接口,但将其实现留给其他类。抽象方法只能存在于抽象类中。
1 |
abstract class Doer { |
抽象类(abstract)
使用abstract
修饰符定义抽象类 - 无法实例化的类
。抽象类对于定义接口非常有用,通常还有一些实现。如果希望抽象类看起来是可实例化
的,请定义工厂构造函数
。
1 |
abstract class Doer { |
Dart
与 Java
关于 抽象类
的区别:
Dart
:由abstract
关键字修饰的类就是抽象类,由关键字
决定。Java
:只要一个类中有未实现的方法,这个方法就是抽象类,由方法
决定。
隐式接口(interfaces)
每个类隐式的定义了一个接口,含有类的所有实例和它实现的所有接口。如果你想创建一个支持类 B 的 API 的类 A,但又不想继承类 B ,那么,类 A 应该实现类 B 的接口。
一个类实现一个或更多接口通过用 implements 子句声明,然后提供 API 接口要求。例如
1 |
// A person. The implicit interface contains greet(). |
这里是具体说明一个类实现多个接口的例子:
1 |
class Point implements Comparable, Location { |
特点:
这里的interface
接口和java不同
在于:不需要
定义interface
,任何class
都可以被implements
继承类(extends)
同Java
重写成员(@override)
同Java
注意:要在类型安全
的代码中缩小
方法参数 或 实例变量 的 类型
,可以使用covariant
关键字。
例子:
1 |
class Animal { |
虽然此示例显示covariant
在子类型
中使用,但covariant
关键字可以放在超类
或子类方法
中。通常,超类方法
是放置它的最佳位置
。该covariant
关键字适用于单个参数
,并且在setter和字段上也受支持。
重写操作符
您可以覆盖下表中显示的运算符。
说明:表达e1 != e2
是!(e1 == e2)
的语法糖。
一个覆盖+
和-
运算符的类的示例:
1 |
class Vector{ |
结果为:
1 |
x is 2, y is 2 |
noSuchMethod()
可以通过重写noSuchMethod()可以发现或者对在代码中尝试使用不存在的方法
或者实例变量
作出反应。
1 |
class A { |
你不能调用未实现的方法,除非以下一个是真实的:
接收器具有静态类型dynamic。
接收器有一个静态类型,它定义了未实现的方法(抽象是OK),接收器的动态类型的实现与类noSuchMethod() 中的实现不同Object。
枚举类型
枚举类型(通常称为枚举或枚举)是一种特殊类,用于表示固定数量
的常量值
。
使用enum
关键字声明枚举类型:
1 |
enum Color { red, green, black } |
枚举中的每个值都有一个index
,从0
开始。如:
1 |
assert(Color.black.index == 2); |
要获取枚举中所有值的列表
,请使用枚举values
常量。如:
1 |
List<Color> colors = Color.values; |
结果为:
1 |
当前的索引为: 0 ,对应着的值为:Color.red |
switch
用法
1 |
void doSwitch() { |
向类添加功能:mixin
mixins
是一种在多个类层次结构
中重用类代码
的方法。可以简单的理解为: mixin修饰的类
中定义了多个类
中公用
的变量
和方法
。
mix
是混合的意思
;in
是在……里面
。那么mixin
可以理解为:可以混合在指定类里面
的公用代码块
。用mixin
关键字代替class
关键字来实现一个可扩展的Object类
,且无需声明构造函数 :
mixin
本身可以
是抽象
的,可以定义各种方法属性,也可以是抽象的,等后续类去实现。
mixin使用
要使用 mixin
,请使用with
关键字后跟一个或多个
mixin关键字修饰的类。以下示例显示了使用有mixins
修饰的类:
1 |
mixin TestMixin { |
注意:mixin
是 Dart 2.1
中引入的对关键字的支持。
mixin与on关键字:
要指定只有
某些类型可以使用mixin
——使用on
来指定所需的超类
,这样你的mixin
可以调用一个它自身没有定义
的方法:
1 |
class BaseObject { |
当使用on
关键字后,则表示该mixin修饰的类
只能在那个类的子类
使用了。
多个mixin
1 |
mixin TestMixin1 on BaseContext{ var intValue = 1; void mix1() => print('this is from textMixin1'); void printAnother() => sayHello(); } mixin TestMixin2 on BaseContext{ |
在TestMixin1
与TestMixin2
中都声明了一个intValue
变量,但是值不同。在class TestClass extends BaseContext with TestMixin1,TestMixin2
的顺序中,得到的结果是:
1 |
2 |
即:TestMixin2
中初始化的值。
那么改变一下with
的顺序呢?class TestClass extends BaseContext with TestMixin2,TestMixin1
,结果是:
1 |
1 |
由此可见:取值的是最后一个with
的类中的值。
类变量和方法
使用static
关键字实现类范围
的变量和方法。
静态变量
静态变量(类变量)
对于类范围
的状态
和常量
很有用:
1 |
class Queue { |
注意:
- 静态变量在
使用之前
不会初始化。 - 遵循
样式指南
建议,优先使用lowerCamelCase
作为常量名称
。
静态方法
1 |
class Point { |
注意:
- 对于常用或广泛使用的实用程序和功能,请考虑使用
顶级函数
而不是静态方法。
您可以使用静态方法作为编译时常量。例如,您可以将静态方法作为参数传递给常量构造函数。
Dart-Tour2-类的更多相关文章
- Dart 面向对象 类 方法
Dart是一门使用类和单继承的面向对象语言,所有的对象都是类的实例,并且所有的类都是Object的子类. 面向对象编程(OOP)的三个基本特征是:封装.继承.多态 封装:封装是对象和类概念的主要特性. ...
- [dart学习]第七篇:类(构造函数)
前言:楼主平时基本没有使用过异常处理,所以对异常的认知可能不够准确,这里就不翻译异常的相关内容了,大家可以去官网自行阅读介绍,地址 https://dart.dev/guides/language/l ...
- Dart 语言简易教程系列
google Fuchsia系统 及 dart语言简介 在 InteIIiJ IDEA 中搭建 Dart 的开发环境 Dart Linux 开发环境搭建 Dart 语言简易教程(一) Dart 语言简 ...
- Dart编程语言入门
Dart基础入门语法介绍,详细说明可以查看相关视频<Dart编程语言入门>. 变量与常量 变量 1.使用 var 声明变量,默认值为 null var a;//null a = 10; 2 ...
- Dart和JavaScript对比小结
作为一名web前端来入门dart,新语言和我们熟悉的js有所差异,写dart的过程中容易受到原有思维的影响,这里把dart和js做一个对比总结,方便查找和熟悉. 变量声明 var 关键字 dart和j ...
- Dart 和 Flutter 使用json_annotation和json_serializable来处理json数据教程
在学习fultter的时候突然想到如何去处理从服务器获取的json或者将app中的对象数据转换成json上传给服务器 于是研究一下dart对json数据的处理 首先需要依赖下面的第三方库(这里要强调下 ...
- 【dart学习】-- Dart之类和对象
一,概述 类(Class)是面向对象程序设计,实现信息封装的基础.类是一种用户定义的类型.每个类包含数据说明和一组操作数据或传递消息的函数.类的实例称为对象. Dart的类与其它语言都有很大的区别,比 ...
- Flutter 使用json_model解析json生成dart文件
一.json_serializable使用步骤 1.集成json_serializable pubspec.yaml 添加以下依赖 dependencies: json_annotation: ^2. ...
- flutter--Dart基础语法(三)类和对象、泛型、库
一.前言 Flutter 是 Google 开源的 UI 工具包,帮助开发者通过一套代码库高效构建多平台精美应用,Flutter 开源.免费,拥有宽松的开源协议,支持移动.Web.桌面和嵌入式平台. ...
- Java类的继承与多态特性-入门笔记
相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...
随机推荐
- C/S 和 B/S架构
C/S 和 B/S架构 一.单机架构 应用领域: 植物大战僵尸 office 二.C/S架构 [ 应用领域: QQ 大型网络游戏 计算机发展初期用户去取数据,直接就去主机拿,从这里开始就分出了客户端和 ...
- centos 7搭建 strongSwan
https://blog.csdn.net/sqzhao/article/details/76093994
- Notification通知在OPPO手机上不弹出提示?
oppo默认应用 不允许通知. 解决步骤:设置 通知与状态栏 通知管理 NotificationTest 允许通知
- JS事件高级
1. 注册事件(绑定事件) 1.1注册事件概述 1.2 addEventListener 事件监听方式 1.3 attachEvent 事件监听方式 1.4 注册事件兼容性解决方案 2. 删除事件(解 ...
- ES6之展开运算符
本文介绍ES6新增的展开运算符(spread operator). 由上图可得,展开运算符负责拼装数组和对象,与之相反,解构赋值负责分解数组和对象. 由上图可得,展开运算符能和解构赋值一起发挥成更大的 ...
- 解决在Anaconda中的cv2在pycharm中不可使用的问题
在Anaconda中已经安装好的opencv模块在pycharm中却不能正常使用,后来发现是pycharm使用的python环境中没有opencv的包,解决方法有两种: 方法一 在pycharm的设置 ...
- 画张自己能理解的dotnet core 微服务图
- python常见内置函数总结
简单的内置函数 len 求长度 min 求最小值 max 求最大值 sorted 排序 reversed 反向 sum 求和 进制转换 bin 转为二进制 oct 转为八 ...
- Opencv笔记(六)——把滑动条当调色板
学习目标: 学会把滑动条绑定到 OpenCV 的窗口. 学习函数:cv2.getTrackbarPos(), cv2.creatTrackbar()等. 简单演示: 通过调节滑动条来设定画板颜色.我们 ...
- Dangal 观影感受,(摘录)
===================================================================================== 引用: https://ww ...