Dart: class的那些事

Dart: class的那些事

若你有物件導向的相關經驗,你可能就瞭解Class和Instance的關係
Class 是一個藍圖,Instance 是依照class 這個藍圖所建立的物件

Dart 的Class 也有Constructor

以下有一個簡單的範例

class Person{
String name;
int age;
Person({String inputName, int age}){ // 這邊的{}代表可選的,不一定要輸入
this.name = inputName;
this.age = age;
}
}

我們執行看看以下程式碼

void main() {
var p1 = Person();
print(p1.name);
var p2 = Person(inputName:'Mary');
print(p2.name);
}
執行結果

我們可以看到,p1 沒有傳入任何的參數,則p1.name 值為null
在p2這個instance傳入可選參數inputName時,p2.name 值為Mary

相反的,如果不用{}包裹,則代表必需要有這個參數如下

class Person{
String name;
int age;
Person(int age){
    this.age = age;
}
}

若執行如下程式碼,則報錯1 required argument(s) expected, but 0 found.

void main() {
var p1 = Person();
}

另外可選參數也可以使用[]去包裹,和{}不一樣的地方在於,{}呼叫時必須帶有參數名,若以[]包裹時,則呼叫時必須按照順序使用

Constructor 傳入參數變成Instance屬性值,簡寫方法

class Person{
String name;
int age;
Person({this.name, this.age = 30}){}
}

執行測試程式碼,檢驗結果

void main(){
var p1 = Person(name: "Max");
print(p1.age);
print(p1.name);
}

執行結果為30、Max

Class Constructor 的 Overload,並加入上述所說的「Constructor 傳入參數變成Instance屬性值

說到這邊假設我要快速的產生一個名字不確定,但age 為8的小孩該如何做?

格式是: classname.constructorName

class Person {
String name;
int age;
Person.child(this.name){ // Overload
this.age = 8;
}
}

void main() {
var p1 = Person.child('Max');
print(p1.age);
print(p1.name);
runApp(MyApp());
}

執行結果為8、Max