9.Dart中的類有何不同?

CoorChice發表於2019-03-19

目錄傳送門:《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


相關文章