Flutter學習之Dart 類與對象

類與對象

  • 使用關鍵字 class 聲明一個類
  • 使用關鍵字 new 創建一個對象,new 可以省略
  • 所有對象都繼承於 Object 類

對象的基礎定義與創建

// 定義一個Person類
class Person{
}

void main(){
    //創建方式一: 可以通過 new 關鍵字創建
    Person person = new Person();
    // 創建方式二:直接使用 Person() 
    Person person1 = Person();
}

屬性和方法

  • 屬性默認會生成 getter 和 setter 方法
  • 使用 final 聲明的屬性只有 getter 方法
  • 屬性和方法通過 . 訪問
  • 方法不能被重載

圖:final 屬性報錯圖示

圖:方法不能重載報錯圖示

類以及成員可見性

  • Dart 中的可見性以 library(庫)爲單位
  • 默認情況下,每一個 Dart 文件就是一個庫
  • 使用 _ 表示庫的私有性
  • 使用 import 導入庫

將成員變量或者方法加上 “_” 就表示私有的(;類似於 Java 中的 private),在另外一個 dart 文件中就無法訪問

A類的 屬性 或者 方法 如果是以下劃線開頭命名的,則在 B類 則不能訪問A類的屬性和方法。

如果 A類 聲明也是下劃線開頭命名的則 A類的訪問範圍只能在 A類 所處的 dart 文件,出了這個 dart 文件的範圍 在別的文件是訪問不到的。

類的計算屬性

前面介紹的是存儲屬性,是可以存入這個類的一些特性的值

  • 顧明思議,計算屬性的值是通過計算而來,本身不存儲值
  • 計算屬性賦值,其實是通過計算轉換到其他實例變量

計算屬性指的是和一般的類成員屬性一樣,具有 getter 與 setter 方法,但是不能作爲存儲值使用,只能返回的是結算之後的結果值。

class Rectangle {
  num width, heigth;

  /** 計算屬性的寫法 */
  //這個寫法和下面的寫法一致 num get area { return width * heigth; }
  num get area => width * heigth;

  void set area(value) {
    width = width / 20;
  }
}

void main(List<String> args) {
  var rect = new Rectangle();
  rect.heigth = 20;
  rect.width = 10;

  // 獲取屬性
  print(rect.area); // 200

  // 設置屬性
  rect.area = 2;      // 將寬度修改爲 0.5 
  print(rect.area);   // 10
}

構造方法

關於構造方法的幾點總結:

  • 如果沒有自定義構造方法,則會有個默認構造方法
  • 如果存在自定義構造方法,則默認構造方法無效
  • 構造方法不能重載
  • 使用命名構造方法,可以實現多個構造方法
  • 使用類名.方法的形式實現

默認的構造方法 與 帶參數的構造方法

class Person{

  String name;
  int age;

  // 默認的構造方法,無參的構造方法可以省略
  // Person (){}

  // 帶參數的構造方法
  Person(String name, int age){
    this.name = name;
    this.age = age;
  }
  
  //帶參數的構造方法還可以寫成這種格式 Person(this.name, this.age){}
}

 構造方法不能重載,多個構方法同時存在會報錯

 

給 final 關鍵字修飾的屬性賦值

class Person {
  String name;
  int age;
  final String gender;
  
  // 通過構造器給 final 修飾的屬性賦值
  Person(this.age, this.name, this.gender);
}

多個構造方法同時存在的情況

class Person{

  String name;
  int age;

  // 默認的構造方法,無參的構造方法可以省略
  Person (){}

  // 帶參數的構造方法
  Person.withName(String name){
    this.name = name;
  }

  Person.withNameAndAge(this.name, this.age){}
}

void main(List<String> args) {
  Person person = new Person();
  Person person1 = new Person.withName("name");
  Person person2 = new Person.withNameAndAge("name", 12);
}

常量構造方法聲明

  • 如果類是不可變狀態,可以把對象定義爲編譯時常量
  • 使用 const 聲明構造方法,並且所有變量都爲 final
  • 使用 const 聲明對象,可以省略

重要說明:

要聲明常量類需要使用 const 修飾,並且還需要所聲明類有 常量構造方法 。

const 修飾的構造方法叫常量構造方法,所有屬性也必須用final修飾。

工廠構造方法

  • 工廠構造方法類似於設計模式中的工廠模式
  • 在構造方法前添加關鍵字 factory 實現一個工廠構造方法
  • 在工廠構造方法中可返回對象

工廠構造方法 與 普通的構造方法區別在於:普通的構造方法不能有返回值。

圖爲:普通的構造方法帶有返回值報錯提示

 一個完整的 工廠構造方法例子:

class Logger{
    final String name;
    static final Map<String, Logger> _cache = <String, Logger>{};
    
    factory Logger(String name){
        if(_cache.containsKey(name)){
            return _cache[name];
        }else {
            final logger = Logger._internal(name);
            _cache[name] = logger;
            return logger;
        }
    }
    
    Logger._internal(this.name);
    
    void log(String msg){
      print(msg);
    }
}

 初始化列表賦值方式

初始化列表賦值的方式賦值最大的好處是給 final 屬性賦值。看圖中 Person.withMap ( Map map ) 這一段

 

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