阅读 600

9.Dart中的类有何不同?

目录传送门:《Flutter快速上手指南》先导篇

Dart 使用 class 来定义一个类。

定义一个类

class Point{
  var x;
  var y;

  Point(x, y){
    this.x = x;
    this.y = y;
  }
}
复制代码

在 Dart 中,如果一个类没有显示的定义默认的构造函数,会默认有一个空的构造函数。

上面的代码中,已经定义了一个默认构造函数了,如果需要定义新的构造函数,需要通过如下方式:

class Point{
  var x;
  var y;

  Point(this.x, this.y);

  Point.origin(){
    x = 0;
    y = 0;
  }
}

var p = Point.origin();
复制代码

Point(this.x, this.y) Dart 允许这样书写一个默认构造函数。

创建一个类对象

创建一个类对象的方式如下:

var p1 = Point(1, 1);
var p2 = new Point(1, 1);
复制代码

Dart 同时支持以上两种创建一个类对象的方式。

new 关键字从 Dart 2.0 开始支持。

使用类的属性

在 Dart 中,类所有的属性和函数默认都是对外可见的。

var p1 = Point(1, 1);
print(p1.y);


>>>
1

p1.y = 5;
print(p1.y);


>>>
5
复制代码

空安全 ?.

Dart 在调用对象属性前,支持先检查对象是否为 null。

如果不为 null,才会调用,这和 Kotlin 十分的像。

var p;
p?.y = 5;
复制代码

级联操作符 ..

先看一个例子:

querySelector('#confirm') // Get an object.
  ..text = 'Confirm' // Use its members.
  ..classes.add('important')
  ..onClick.listen((e) => window.alert('Confirmed!'));
复制代码

Dart 支持使用 .. 操作符编写如上的流式语句。

当然前提是,你所调用的函数返回值为 void

初始化列表

在执行构造函数体内的表达式前,Dart 支持插入初始化操作。

class Point {
  final num x;
  final num y;
  final num distanceFromOrigin;

  Point(x, y)
      : x = x,
        y = y,
        distanceFromOrigin = sqrt(x * x + y * y);
}
import 'dart:math';
​
class Point {
  final num x;
  final num y;
  final num distanceFromOrigin;
​
  Point(x, y)
      : x = x,
        y = y,
        distanceFromOrigin = sqrt(x * x + y * y);
}
​
main() {
  var p = new Point(2, 3);
  print(p.distanceFromOrigin);
}


>>>
3.605551275463989
复制代码

get/set 函数

在 Dart 中,get/set 函数支持以下书写方式:

class Rectangle {
  num left, top, width, height;

  Rectangle(this.left, this.top, this.width, this.height);

  num get right => left + width;
  set right(num value) => left = value - width;
  num get bottom => top + height;
  set bottom(num value) => top = value - height;
}

void main() {
  var rect = Rectangle(3, 4, 20, 15);
  assert(rect.left == 3);
  rect.right = 12;
  assert(rect.left == -8);
}
复制代码

类型检测

使用 is 关键字判断一个对象的类型是否属于一个类。

var p = Point(1, 1);
print(p is Point);


>>>
true
复制代码

is! 恰好于此相反。

类型转换

Dart 使用 as 关键字来进行强制类型转换。

(emp as Person).firstName = 'Bob';
复制代码

获得对象的运行时类型

通过 runtimeType 属性,可以获得一个对象的类型。

print('The type of a is ${a.runtimeType}');复制代码

目录传送门:《Flutter快速上手指南》先导篇

如何找到我?

传送门:CoorChice 的主页

传送门:CoorChice 的 Github