7.Classes-类(Dart中文文档)
Dart是一个面向对象的语言,同时增加了混入(mixin)继承的特性。对象都是由类初始化生成的,所有的类都由Object对象继承。混入继承意味着尽管所有类(除了Object类)只有一个父类,但是类的代码体可以在多个类中重复使用。(个人理解:mixin,extends,implements,extends是类似java单继承,implements类似java的多接口实现,但这些都是运行时使用,mixin应该是在编译时使用,类似于jsp的include,比如 A with B,其实是在编译时,将两个类的代码合并,编译成classes) 。
Using class members 类成员
对象由成员变量和方法构成。你可以用点(.)调用方法或者成员变量
var p = Point(2, 2);
// Set the value of the instance variable y.
p.y = 3;
// Get the value of y.
assert(p.y == 3);
// Invoke distanceTo() on p.
num distance = p.distanceTo(Point(4, 4));
Use ?. instead of . to avoid an exception when the leftmost operand is null:
// If p is non-null, set its y value to 4.
p?.y = 4;
Using constructors 构造方法
你可以用构造方法创建对象,构造方法是ClassName或者ClassName.identifier.下面是构造方法的两种写法:
Point() and Point.fromJson() constructors:
var p1 = Point(2, 2);
var p2 = Point.fromJson({'x': 1, 'y': 2});
下面的构造方法多了new关键字:
var p1 = new Point(2, 2);
var p2 = new Point.fromJson({'x': 1, 'y': 2});
版本注意:new 关键字在Dart2中是可选的
。
一些类提供了静态构造方法。当你需要这些创建编译常量对象,可以在构造对象代码前加上const关键字。
var p = const ImmutablePoint(2, 2);
两个相同入参的编译对象常量是相等。
var a = const ImmutablePoint(1, 1);
var b = const ImmutablePoint(1, 1);
assert(identical(a, b)); // They are the same instance!
在编译常量上下中,可以忽略后续的const关键字,也可以达到同样效果
// Lots of const keywords here.
const pointAndLine = const {
'point': const [const ImmutablePoint(0, 0)],
'line': const [const ImmutablePoint(1, 10), const ImmutablePoint(-2, 11)],
};
这是简化的写法:
// Only one const, which establishes the constant context.
const pointAndLine = {
'point': [ImmutablePoint(0, 0)],
'line': [ImmutablePoint(1, 10), ImmutablePoint(-2, 11)],
};
如果用常量构造器初始化对象,但是没有加入const关键字,它将是非常量对象
var a = const ImmutablePoint(1, 1); // Creates a constant
var b = ImmutablePoint(1, 1); // Does NOT create a constant
assert(!identical(a, b)); // NOT the same instance!
版本注意: const关键字的忽略写法在Dart2中才有效
Getting an object’s type 获取对象类型
在运行时获取对象的类型,你可以用Object的对象的 runtimeType属性。
print('The type of a is ${a.runtimeType}');
Instance variables 成员变量
下面是如何定义成员变量:
class Point {
num x; // Declare instance variable x, initially null.
num y; // Declare y, initially null.
num z = 0; // Declare z, initially 0.
}
所有为初始化变量的值是null.
所有成员变量都内置get方法。非final的成员变量内置了set方法。
class Point {
num x;
num y;
}
void main() {
var point = Point();
point.x = 4; // Use the setter method for x.
assert(point.x == 4); // Use the getter method for x.
assert(point.y == null); // Values default to null.
}
如果你在成员变量的定义时就进行初始化,在对象创建时,它将先于构造器和初始化列表执行。
Constructors 构造器
类构造器是和类名同名的函数,(其中还有一种命名构造函数的写法,后续介绍)。
class Point {
num x, y;
Point(num x, num y) {
// There's a better way to do this, stay tuned.
this.x = x;
this.y = y;
}
}
上面的例子中,thisg关键字可以读取成员变量。
注意:使用this只有在方法参数和成员变量有冲突时才用,其它场景可以不写
如果构造器的入参和成员变量对应,可以直接赋值,可以用如下的简化写法:
class Point {
num x, y;
// Syntactic sugar for setting x and y
// before the constructor body runs.
Point(this.x, this.y);
}
Default constructors 默认构造器
如果没有定义构造器,类将提供一个无参构造器,如果类有一个父类,也会调用父类的无参构造器
Constructors aren’t inherited 构造器不可继承
子类不会继承父类的构造器,如果子类没有定义构造器,它只有默认的无参构造器,不会去继承父类的构造器。
Named constructors 命名构造器
Dart可以使用命名构造器去实现多个构造逻辑。
class Point {
num x, y;
Point(this.x, this.y);
// Named constructor
Point.origin() {
x = 0;
y = 0;
}
}
构造器是不可继承的,这个规则在命名构造器同样有效。如果你想要一个和父类一样的命名构造器,需要在子类的自己定义同样的构造器。
Invoking a non-default superclass constructor 调用父类的非默认构造器
默认情况下,子类的构造器将调用父类的默认构造器。父类构造器先于子类构造器执行,如果子类构造器有初始化执行器列表,它将先于父类构造器执行,如下是执行顺序:
initializer list
superclass’s no-arg constructor
main class’s no-arg constructor
如果父类没有默认构造器,你必须手动调用父类的其它构造器。写法是在子类构造器名后面加上冒号(
7.Classes-类(Dart中文文档)的更多相关文章
- 6.Exceptions-异常(Dart中文文档)
异常是用于标识程序发生未知异常.如果异常没有被捕获,If the exception isn't caught, the isolate that raised the exception is su ...
- 2.Built-in types-基本数据类型(Dart中文文档)
初次翻译,部分内容并非按字面翻译,是按本人理解进行了内容重组.如有错误望指正. Dart语言内置如下数据类型: numbers strings booleans lists (所谓的数组) maps ...
- 1.Variables-变量(Dart中文文档)
初次翻译,部分内容并非按字面翻译,是按本人理解进行了内容重组.如有错误望指正. 如下是变量定义和赋值的示例 var name = 'Bob'; 变量存储的是一个引用地址.如上的变量name指向了一个值 ...
- 8.Generics 泛型(Dart中文文档)
这篇翻译的不好 如果你看API文档中的数组篇,你会发现类型一般写成List.<...>的写法表示通用类型的数组(未明确指定数组中的数据类型).通常情况泛型类型用E,T,S,K,V表示. W ...
- 4.Operators-操作符(Dart中文文档)
Dart有如下操作符: Description Operator unary postfix expr++ expr-- () [] . ?. unary prefix -expr !expr ~ex ...
- 5.Control flow statements-流程控制(Dart中文文档)
你可以使用如下流程控制符: if and else for loops while and do-while loops break and continue switch and case asse ...
- 3.Functions-函数(Dart中文文档)
初次翻译,部分内容并非按字面翻译,是按本人理解进行了内容重组.如有错误望指正. Dart是完全的面向对象的语言,甚至函数也是一个Function类型的对象.这意味着函数可以赋值给变量或者作为函数的参数 ...
- Flutter 中文文档网站 flutter.cn 正式发布!
在通常的对 Flutter 介绍中,最耳熟能详的是下面四个特点: 精美 (Beautiful):充分的赋予和发挥设计师的创造力和想象力,让你真正掌控屏幕上的每一个像素. ** 极速 (Fast)**: ...
- PyTorch官方中文文档:torch.nn
torch.nn Parameters class torch.nn.Parameter() 艾伯特(http://www.aibbt.com/)国内第一家人工智能门户,微信公众号:aibbtcom ...
随机推荐
- Django 模板继承extend 标签include block
# block 站网页位置# includ 导入网页标签# extends 导入网页模板 # common_js.html <script src="/static/plugins/j ...
- 团队项目个人进展——Day03
一.昨天工作总结 冲刺第三天,昨天忙着整理数据结构相关知识,在团队项目上只是花了少部分时间来对地图的样式布局进行调整 二.遇到的问题 无 三.今日工作规划 继续昨天的规划,研究地图定位代码,并通过编写 ...
- 【gp数据库】OLTP和OLAP区别详解
原来一直使用Oracle,新公司使用greenplum后发现系统的并发性差很多,后来才了解因为Oracle属于OLTP类型,而gp数据库属于OLAP类型的.具体了解如下: 数据库系统一般分为两种类型, ...
- 【Excel】如何用SUMIF实现SUMIFS的功能
如何用SUMIF实现SUMIFS的功能 添加辅助列,辅助列内容为"条件区域1内容+条件区域内容2" 举个例子,我要挑选出"二车间"的"过桥过路费& ...
- Git忽略提交 .gitignore配置。自动生成IDE的.gitignore。解决gitignore不生效
语法 以”#”号开头表示注释: 以斜杠“/”开头表示目录: 以星号“*”通配多个字符: 以问号“?”通配单个字符 以方括号“[]”包含单个字符的匹配列表: 以叹号“!”表示不忽略(跟踪)匹配到的文件或 ...
- django中session的存储位置
django-session 存放位置 设置session的保存位置,有三种方法: 保存在关系数据库(db) 保存在缓存数据库(cache) 或者 关系+缓存数据库(cache_db) 保存在文件系统 ...
- Windows10自动更新之后,无线有线都连不上网
大概浪费了我至少6个小时. 一个是无线网卡,这个后来可以修复,其实也不是网卡的原因.最主要的原因是 Realtek PCIe GBE Family Controller 这个驱动.只找到一个win1 ...
- C++ Circle
作业链接 https://github.com/How-Come/object-oriented/tree/master/Circle
- 面向对象程序设计_课堂作业_01_Circle
The 1st classwork of the C++ program 题目: Create a program that asks for the radius of a circle and p ...
- screen 命令基本操作教程
sreen 命令提供的基本功能与 tmux 较为相似( 关于 tmux 基本操作可参见笔者的博文 终端复用工具 tmux 基本操作教程 ).screen 命令以会话( session )为基础为用户提 ...