類別
類別語法
類別 變數名 = 類別(參數名: 值, 參數名: 值);
建構子
語法
類別名({可選命名參數}) {
}
1
2
3
4
5
6
7
8
9
10
11
12
13
void main() {
Cat cat1 = Cat(name: "Bill", age: 1);
print("cat1 name: ${cat1.name}, age: ${cat1.age}");
}
class Cat {
String? name;
int? age;
Cat({String? name, int? age}) {
this.name = name;
this.age = age;
}
}
cat1 name: Bill, age: 1
類別名.函式名({可選命名參數})
語法:
類別名.函式名({可選命名參數}) {
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void main() {
Cat cat1 = Cat(name: "Bill", age: 1);
print("cat1 name: ${cat1.name}, age: ${cat1.age}");
Cat cat2 = Cat.create(name: "Mary", age: 10);
print("cat2 name: ${cat2.name}, age: ${cat2.age}");
}
class Cat {
String? name;
int? age;
Cat({String? name, int? age}) {
this.name = name;
this.age = age;
}
Cat.create({String? name, int? age}) {
this.name = name;
this.age = age;
}
}
cat1 name: Bill, age: 1
cat2 name: Mary, age: 10
精簡建構子
語法:
建構子({this.屬性1, this.屬性2});
類別名.函式名({this.屬性1, this.屬性2});
1
2
3
4
5
6
7
8
9
10
11
12
13
void main() {
Cat cat1 = Cat(name: "Bill", age: 1);
print("cat1 name: ${cat1.name}, age: ${cat1.age}");
Cat cat2 = Cat.create(name: "Mary", age: 10);
print("cat2 name: ${cat2.name}, age: ${cat2.age}");
}
class Cat {
String? name;
int? age;
Cat({this.name, this.age});
Cat.create({this.name, this.age});
}
cat1 name: Bill, age: 1
cat2 name: Mary, age: 10
私有屬性 私有方法
前面加上底線就變成私有,只能在自己類別內使用,外部無法讀取,除非提供公有方法給外部讀取。
語法
類型? _屬性名;
傳回值類型 _方法名() {
}
繼承
dart只有單繼承,沒有多繼承。
語法
class 子類別 extends 父類別 {
}
繼承中的建構子
dart 跟 Java、Python 不一樣,子類別不會自動繼承父類別的建構子。
以下程式碼會編譯(語法)錯誤,因為 Child 沒有建構子。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void main() {
Child child1 = Child(name: "Bill", age: 1);
child1.printInfo();
}
class Parent {
String? name;
int? age;
Parent({this.name, this.age});
void printInfo() {
print("name: $name, age: $age");
}
}
class Child extends Parent {}
子類別繼承父類別的建構子:
子類別({可選命名參數}) : super(父類別屬性1:命名參數, 父類別屬性2:命名參數);
修改後的子類別建構子。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void main() {
Child child1 = Child(name: "Bill", age: 1);
child1.printInfo();
}
class Parent {
String? name;
int? age;
Parent({this.name, this.age});
void printInfo() {
print("name: $name, age: $age");
}
}
class Child extends Parent {
Child({String? name, int? age}) : super(name: name, age: age);
}
override 覆寫
子類別覆寫父類別的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void main() {
Child child1 = Child(name: "Bill", age: 1);
child1.printInfo();
}
class Parent {
String? name;
int? age;
Parent({this.name, this.age});
void printInfo() {
print("name: $name, age: $age");
}
}
class Child extends Parent {
Child({String? name, int? age}) : super(name: name, age: age);
@override
void printInfo() {
print("Chid name: $name, age: $age");
}
}
Chid name: Bill, age: 1
多型
多型的方式有二種:
- override 方法覆寫
- 抽象類別
override 方法覆寫
- 子類別覆寫父類別的方法。
- 父類別 變數 = 子類別()
- 變數.呼叫子類別覆寫父類別的方法()
類型雖然是父類別,但實際指向的物件是子類別。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void main() {
Animal dog = Dog();
dog.eat();
Animal cat = Cat();
cat.eat();
}
class Animal {
eat() {
print("Animal eating");
}
}
class Dog extends Animal {
@override
eat() {
print("Dog eating");
}
}
class Cat extends Animal {
@override
eat() {
print("Cat eating");
}
}
Dog eating
Cat eating
抽象類別
抽象類別中的方法不實作,但繼承的子類別一定要實作。
抽象類別不能被建立。
多型的步驗:
- abstract class 父類別
- 宣告抽象方法(),()後面是分號,沒有內容。
- 子類別 implements 父類別
- override 覆寫抽象方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void main() {
Animal dog = Dog();
dog.eat();
Animal cat = Cat();
cat.eat();
}
abstract class Animal {
void eat();
}
class Dog implements Animal {
@override
eat() {
print("Dog eating");
}
}
class Cat implements Animal {
@override
eat() {
print("Cat eating");
}
}
Dog eating
Cat eating