Dart - 类(使用类成员、使用构造函数、获取对象类型)
Dart 的类跟其他语言类似,其他特殊的是它是支持基于 mixin
继承机制的面向对象语言,所有对象都是一个类的实例,而所有的类都继承自 Object 类。基于 mixin 的继承
意味着每个除 Object 类之外的类都只有一个超类,一个类的代码可以在其它多个类继承中重复使用。 Extension 方法是一种在不更改类或创建子类的情况下向类添加功能的方式。
关于mixin
和extension
后面会更详细地介绍。
使用类成员
对象的 成员
由函数和数据
(即 方法 和 实例变量)组成。方法的调用要通过对象来完成,这种方式可以访问对象的函数和数据。
使用(.)
来访问对象的实例变量或方法:
var p = Point(2, 2);
// 为实例变量 y 赋值。
p.y = 3;
// 获取 y 的值。
assert(p.y == 3);
// 调用变量 p 的 distanceTo() 方法。
num distance = p.distanceTo(Point(4, 4));
使用 ?.
代替 .
可以避免因为左边表达式为 null
而导致的问题:
// 如果 p 为非空则将其属性 y 的值设为 4
p?.y = 4;
使用构造函数
可以使用 构造函数 来创建一个对象。构造函数的命名方式可以为 类名
或 类名.标识符
的形式。例如下述代码分别使用 Point()
和 Point.fromJson()
两种构造器创建了Point
对象:
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});
版本提示:
"从 Dart 2 开始,new 关键字是可选的。"
一些类提供了常量构造函数。使用常量构造函数,在构造函数名之前加 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
关键字。例如下面的例子中我们创建了一个常量 Map:
// 只需要一个 const 关键字,其它的则会隐式地根据上下文进行关联。
const pointAndLine = {
'point': [ImmutablePoint(0, 0)],
'line': [ImmutablePoint(1, 10), ImmutablePoint(-2, 11)],
};
但是如果无法根据上下文判断是否可以省略 cosnt
,则不能省略掉 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!)
获取对象的类型
可以使用 Object 对象的 runtimeType
属性在运行时获取一个对象的类型,该对象类型是 Type 的实例。
print('The type of a is ${a.runtimeType}');