編程語言雖然千差萬別,但歸根結底,它們的設計思想無非就是回答兩個問題:javascript
一、如何表示信息;java
二、如何處理信息;編程
bool isZero(int number) => number == 0; void printInfo(int number, Function check) => print("$number is Zero: ${check(number)}");
bool isZero(int number) => number == 0; void printInfo(int number, Function check) => print("$number is Zero: ${check(number)}"); // 要達到可選命名參數的用法,那就在定義函數的時候給參數加上{} void enableFlagsA({bool bold, bool hidden}) => print("$bold, $hidden"); // 定義可選命名參數時增長默認值 void enableFlagesB({bool bold = true, bool hidden = false}) => print("$bold, $hidden"); // 可忽略的參數在函數定義時用[]符號指定 void enableFlagesC(bool bold, [bool hidden]) => print("$bold, $hidden"); // 定義可忽略參數時增長默認值 void enableFlagesD(bool bold, [bool hidden = false]) => print("$bold, $hidden");
Dart是面向對象的語言,每一個對象都是一個類的實例,都繼承自頂層類型Object。 Dart中並無public、protected、private這些關鍵字,只要在聲明變量與方法時,在前面加上_
便可做爲private方法使用,若是不加_
,則默認爲public。不過_
的限制範圍並非類訪問級別的,而是庫訪問級別。安全
class Point { num x, y; static num factor = 0; // 語法糖,等同於在函數體內:this.x = x; this.y = y; Point(this.x, this.y); void printInfo() => print('($x,$y)'); static void printZValue() => print('$factor'); }
此外,與C++相似,Dart支持初始化列表。在構造函數的函數體真正執行以前,還有機會給實例變量賦值,甚至重定向至另外一個構造函數。編程語言
class Point { num x, y, z; Point(this.x, this.y) : z = 0; // 初始化變量z Point.bottom(num x) : this(x, 0); // 重定向構造函數 void printInfo() => print('($x, $y, $z)'); } var p = Point.bottom(100); p.printInfo(); // 輸出(100,0,0)
在面向對象的編程語言中,將其餘類的變量與方法歸入本類中進行復用的方式通常有兩種:繼承父類和接口實現。ide
class Point { num x = 0, y = 0; void printInfo() => print('($x, $y)'); } // Vector 繼承自 Point class Vector extends Point { num z = 0; @override void printInfo() => print('($x,$y,$z)'); // 覆寫了printInfo實現 } // Coordinate 是對 Point 的接口實現 class Coordinate implements Point { num x = 0, y = 0; // 成員變量須要從新聲明 void printInfo() => print('($x, $y)'); // 成員函數須要從新聲明實現 } var xxx = Vector(); xxx ..x = 1 ..y = 2 ..z = 3; // 級聯運算符,等同於 xxx.x = 1; xxx.y = 2; xxx.z = 3; xxx.printInfo(); // 輸出(1,2,3) var yyy = Coordinate(); yyy ..x = 1 ..y = 2; // 級聯運算符,等同於 yyy.x = 1; yyy.y = 2; yyy.printInfo(); // 輸出 (1,2) print(yyy is Point); // true print(yyy is Coordinate); // true
要使用混入,只須要with關鍵字便可。函數
class Coordinate with Point { } var yyy = Coordinate(); yyy ..x = 1 ..y = 2; // 級聯運算符,等同於 yyy.x = 1; yyy.y = 2; yyy.printInfo(); // 輸出 (1,2) print(yyy is Point); // true print(yyy is Coordinate); // true
Dart提供了相似C++的運算符覆寫機制,使得咱們不只能夠覆寫方法,還能夠覆寫或者自定義運算符。ui
class Vector { num x, y; Vector(this.x, this.y); // 自定義相加運算符,實現向量相加 Vector operator + (Vector v) => Vector(x + v.x, y + v.y); // 覆寫相等運算符,判斷向量相等 bool operator == (dynamic v) => x == v.x && y == v.y; } final x = Vector(3,3); final y = Vector(2,2); final z = Vector(1,1); print(x==(y+z)); // 輸出 true