iT邦幫忙

2024 iThome 鐵人賽

0
Mobile Development

Flutter 開發實戰 - 30 天逃離新手村系列 第 38

番外篇 - 快速複習類別

  • 分享至 

  • xImage
  •  

最基本的類別語法

class Person {
  String name;
  int age;
  
  Person(String name, int age) {
    this.name = name;
    this.age = age;
  }
}

推薦使用的基本語法糖

class Person {
  String name;
  int age;
  
  Person(this.name, this.age);
}

各種建構子

class Person {
  String name;
  int age;

  // 基本構造函數
  Person(this.name, this.age);

  // 命名構造函數
  Person.guest() {
    name = 'Guest';
    age = 18;
  }

  // 使用初始化列表的命名構造函數
  Person.adult(this.name) : age = 18;
  
  // 工廠構造函數
  factory Person.fromData(Map<String, dynamic> data) {
    if (data['age'] >= 18) {
      return Person.adult(data['name']);
    } else {
      return Person(data['name'], data['age']);
    }
  }
  
}

其中上面 Person.adult 建構子搭配使用的 : ,這個在建構子後面的「冒號」叫做 Initializer List 初始化列表。在這邊可以使用 , 組織一些表達式 Expression,主要用於執行一些初始化操作。這對於設定 final 變數特別有用。

  • 可以存取建構子的參數
  • 可以給物件實例欄位賦值
  • 自 Dart 2.0 起,支援 assert(...),便於檢查參數值
  • 初始化列表在建構子之前執行

初始化列表

class Person {
  // final 是為了宣告一個不可變動,和 const 的差別為時間點
  // const 在編譯就固定了
  // final 在執行時期
  final String name;
  final int age;
  final String comment;
  
  Person(this.name, this.age): comment = '${name} 目前 ${age} 歲';
}

繼承和 super 建構函式

class Person {
  String name;
  int age;
  
  Person(this.name, this.age);
}

class Developer extends Person {
  String skill;
  
  Developer(String name, int age, String skill): super(name, age);
}

// ⚠️ super 和初始化列表是可以一起使用

存取欄位的語法演進

// 顯示寫法
class Person {
  String _name;
  
  String get name => _name;
  set name(String value) => _name = value;
  
  Person(this._name);
}

// 隱式 / 自動生成的簡潔語法
// 也就是類別的每個公開欄位都自動具備隱式的 getter 和 setter。
class Person {
  String name;
  
  Person(this.name);
}

補充說明

  • 繼承:只能單一繼承表示 is-a 的關係,通過 extends 實現,子類別會獲得父類別的功能可以直接使用或覆寫
  • 介面:是一種表示 behaves-as 的關係,在 Dart 類別也可以作為介面通過 implements 語法實現。一個類別可以實現多個介面,必須提供介面宣告的全部方法
  • 混入(mixin):使用 with 實現,用於共用方法,不適合單一繼承或介面規範重複一樣的實作。
class Vehicle {
  void drive() {
    print('move');
  }
}

class Car implements Vehicle {
  @override
  void drive() {
    print('move with gas');
  }
}

class ElectricCar extends Car {
  @override
  void drive() {
    print('move silently');
  }
}

mixin AutoDriving {
  void navigate() {
    print('navigating');
  }
}

class Tesla extends ElectricCar with AutoDriving {
  @override
  void drive() {
    super.drive();
    navigate();
  }
}

快速複習

class Person {
  // 成員變數
  String name;
  int age;

  // 構造函數
  Person({required this.name, required this.age});

  // 命名構造函數
  Person.withDefaultName({required this.age}) : name = 'Unknown';

  // 方法
  void greet() {
    print('Hello, my name is $name and I am $age years old.');
  }

  // 靜態方法
  static void describe() {
    print('This is a Person class.');
  }

  // Getter
  String get info => 'Name: $name, Age: $age';

  // Setter
  set updateName(String newName) {
    name = newName;
  }
}

上一篇
番外篇 - 理解模式與解構
系列文
Flutter 開發實戰 - 30 天逃離新手村38
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言