相關總結
我們在其他語言中都存在這繼承的操作,在 dart 中同樣存在,都是使用 extends 關鍵字來做爲繼承。下面就詳細介紹下 dart 中的繼承。
Dart 中的繼承操作
-
使用關鍵字 extends 繼承一個類
-
子類會繼承父類可見的屬性和方法,不會繼承構造方法
-
子類能夠複寫父類的方法,getter 和 setter
- 單繼承,多態性
實戰
新建一個 Person.dart 文件,作爲父類
class Person{
String name;
int age;
// 計算屬性
bool get adult => this.age > 18;
// 私有屬性,對於子類不可見
String _birthday;
void run(){
print("Person running...");
}
}
子類訪問父類中的屬性與方法
創建一個子類,用於測試繼承,子類訪問父類的屬性與方法
// 引入 person 文件
import 'Person.dart';
class Student extends Person{
void study(){
print("Student studying...");
}
}
void main(){
Student student = new Student();
// 調用 子類自己的方法
student.study(); // Student studying...
// 訪問 父類中的屬性
student.age = 20;
// 調用 父類的方法
student.run(); // Person running...
// 訪問 父類的計算屬性
print(student.adult); // true
}
覆寫父類的方法以及計算屬性
和 java 中類似,使用 @override 表示覆寫。
import 'Person.dart';
class Student extends Perosn{
// 覆寫父類的計算屬性
bool get adult => this.age > 15;
void study(){
print("Student studying...");
}
@override
void run() {
// 調用父類的方法
super.run();
print("student running...");
}
}
void main(){
Student student = new Student();
student.age = 16;
student.run(); // Person running... student running...
print(student.adult); // true
}
繼承中多態的使用
// 引入 person 文件
import 'Person.dart';
class Student extends Person{
void study(){
print("Student studying...");
}
@override
void run() {
// 調用父類的方法
super.run();
print("student running...");
}
}
void main(){
Person person = new Student();
// error: 這裏無法訪問到 子類的方法,因爲使用多態生成的對象是 Person,Person 中沒有 study方法
person.study();
// 使用 is 表示將 person 轉換爲了 Student,下面就可以訪問了
if (person is Student) {
person.run();
person.study();
}
}
繼承中的構造方法
-
子類的構造方法默認會調用父類的無名無參構造方法
-
如果父類沒有無名無參構造方法,則需要顯示調用父類的構造方法
-
在構造方法參數後使用 : 顯示調用父類構造方法
第一種情況
void main() {
var student = new Person(); // Person...
}
class Person{
// 父類的無參構造方法,一般來說是會省略不寫
Person(){
print("Person...");
}
}
class Student extends Person{
}
第二種情況
void main() {
var student = new Student("name"); // object
}
class Person{
String name;
// 父類中的構造器
Person(this.name);
Person.withName(this.name){
print("object");
}
}
class Student extends Person{
// 使用 : super 調用父類的構造方法
// Student(String name) : super(name); 這種寫法與下面的寫法一致
Student(String name) : super.withName(name);
}
構造方法執行順序
-
父類的構造方法在子類構造方法體開始執行的位置調用
-
如果有初始化列表,初始化列表會在父類構造方法之前執行
子類的構造方法初始化列表,必須要在父類初始化列表之前,否則就會報錯。