Dart

Dart - 类(使用类成员、使用构造函数、获取对象类型)

2019-12-22  本文已影响0人  LouisXWB

Dart 的类跟其他语言类似,其他特殊的是它是支持基于 mixin 继承机制的面向对象语言,所有对象都是一个类的实例,而所有的类都继承自 Object 类。基于 mixin 的继承 意味着每个除 Object 类之外的类都只有一个超类,一个类的代码可以在其它多个类继承中重复使用。 Extension 方法是一种在不更改类或创建子类的情况下向类添加功能的方式。

关于mixinextension后面会更详细地介绍。

使用类成员

对象的 成员函数和数据(即 方法 和 实例变量)组成。方法的调用要通过对象来完成,这种方式可以访问对象的函数和数据。

使用(.)来访问对象的实例变量或方法:

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}');
上一篇下一篇

猜你喜欢

热点阅读