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