Dart入門教程2(完)-可選參數、工廠模式、接口

接上篇Dart入門教程1http://www.lxweimin.com/p/8b566a653cc3

參考:https://codelabs.flutter-io.cn/codelabs/from-java-to-dart/#0

1.使用可選參數

有時候我們的構造函數有很多參數,每次調用構造函數時候,有些參數我們希望可以不必傳入,就使用默認值就好了,不然會很繁瑣,dart當然也提供可選參數的寫法

//Bicycle(this.cadence, this.gear);  
  Bicycle({this.cadence=0, this.gear=1});//記得外面補上大括號"{}""

我們調用時候,可以這樣調用,但需要把key(參數名稱)補上,這里跟c#有點區別:

void main() {
  print(Bicycle());
  print(Bicycle(cadence:10));
  print(Bicycle(gear:10));
  print(Bicycle(cadence:10,gear:10));
}

2.創建工廠模式

工廠模式在java里是一個常見的設計模式,與直接對象實例化相比(new一個對象)有幾個有點,例如是隱藏/封裝實例化的詳情,提供返回可繼承子類的功能,返回一個已經存在的實例(有些實例是可以重復,沒有必要每次都new一個)等等。
這節我們會用一個shape的例子去示范,這個程序會算出圖形面積并打印:

import 'dart:math';//這是dart的一個核心類庫(自帶的)

abstract class Shape {
  num get area;
}

class Circle implements Shape {
  final num radius;
  Circle(this.radius);
  num get area => pi * pow(radius, 2);//pi和pow都是上面import的東西
}

class Square implements Shape {
  final num side;
  Square(this.side);
  num get area => pow(side, 2);
}

main() {
  final circle = Circle(2);//圓形
  final square = Square(2);//正方形
  print(circle.area);
  print(square.area);
}

final關鍵字上次忘了介紹,跟var一樣修飾變量差不多,只不多final修飾的是常量,賦值了不能變,var則可以變
我們運行一下,應該可以看到輸出如下:

12.566370614359172
4
2.1.方法1:創建一個top-leave的方法

我們可以在空白的地方加上(不要在class里)創建一個方法工廠,這個跟javascript有點類似:

import 'dart:math';

abstract class Shape {
  num get area;
}

class Circle implements Shape {
  final num radius;
  Circle(this.radius);
  num get area => pi * pow(radius, 2);
}

class Square implements Shape {
  final num side;
  Square(this.side);
  num get area => pow(side, 2);
}

//創建一個top-leave方法
Shape shapeFactory(String type) {
  if (type == 'circle') return Circle(3);
  if (type == 'square') return Square(2);
  throw 'Can\'t create $type.';
  }

main() {
  final circle = shapeFactory('circle');
  final square = shapeFactory('square');
  
  
  print(circle.area);
  print(square.area);
}
2.2.方法2:創建一個factory的構造函數

dart有一個factory的構造函數可以提供給我們創建工廠,現在我們在抽象類里,加一個factory構造函數并調用:

import 'dart:math';

abstract class Shape {
  num get area;
  
  //添加一個factory構造函數
  factory Shape(String type) {
    if (type == 'circle') return Circle(2);
    if (type == 'square') return Square(2);
    throw 'Can\'t create $type.';
  }
}

class Circle implements Shape {
  final num radius;
  Circle(this.radius);
  num get area => pi * pow(radius, 2);
}

class Square implements Shape {
  final num side;
  Square(this.side);
  num get area => pow(side, 2);
}


main() {
  final circle = Shape('circle');//調用就是直接調用抽象函數,跟平時一樣
  final square = Shape('square');
  
  
  print(circle.area);
  print(square.area);
}

3.實現接口

dart沒有interface關鍵字,因為所有的class默認都是interface,我們來實現Circle 來測試一下

import 'dart:math';

abstract class Shape {
  factory Shape(String type) {
    if (type == 'circle') return Circle(2);
    if (type == 'square') return Square(2);
    throw 'Can\'t create $type.';
  }
  num get area;
}

class Circle implements Shape {
  final num radius;
  Circle(this.radius);
  num get area => pi * pow(radius, 2);
}

class Square implements Shape {
  final num side;
  Square(this.side);
  num get area => pow(side, 2);
}


//實現接口
class CircleMock implements Circle {
  num area;//沒有這些會報錯,這是實現接口的約定
  num radius;
}


main() {
  final circle = Shape('circle');
  final square = Shape('square');
  print(circle.area);
  print(square.area);
}

4.使用dart的函數編程(functional programming)

例如,我們循環打印一些東西:

String scream(int length) => "A${'a' * length}h!";

main() {
  final values = [1, 2, 3, 5, 10, 50];
  for (var length in values) {
    print(scream(length));
  }
}

我們可以看到輸出:

Aah!
Aaah!
Aaaah!
Aaaaaah!
Aaaaaaaaaaah!
Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaah!

上面for的這塊代碼,我們也可以寫成這樣(我喜歡一行過,簡單樸實):

//   for (var length in values) {
//     print(scream(length));
//   }
  values.map(scream).forEach(print);

然后我們跳過第一個item,取第一個item之后的3個item

//   for (var length in values) {
//     print(scream(length));
//   }
   values.skip(1).take(3).map(scream).forEach(print);

輸出如下:
Aaah!
Aaaah!
Aaaaaah!

5.小結

至此教程結束。
dart還是比較簡單易學的一門語言,另外還有更多的內置函數例如隨機數等等,這些用的時候搜一下很容易搜出來,還有async/await這些,跟其他語言差不多,這里我不一一介紹了。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,443評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,530評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,407評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,981評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,759評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,204評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,263評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,415評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,955評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,650評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,892評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,675評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,967評論 2 374