Flutter學習之Dart 中的 extends 繼承操作

相關總結

我們在其他語言中都存在這繼承的操作,在 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);
}

構造方法執行順序

  • 父類的構造方法在子類構造方法體開始執行的位置調用

  • 如果有初始化列表,初始化列表會在父類構造方法之前執行

子類的構造方法初始化列表,必須要在父類初始化列表之前,否則就會報錯。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章