Dart 知識點 - 面向物件基礎

語言: CN / TW / HK

攜手創作,共同成長!這是我參與「掘金日新計劃 · 8 月更文挑戰」的第6天,點選檢視活動詳情

面向物件是一種重要的程式設計思想。比如你需要指明 Jimmy 在說話,那麼你先得從人這個類中例項化 Jimmy 出來:

```bash void main() { var person = new Person(); person.sayHi('Jimmy'); }

class Person { sayHi(String name) { print(name + ' is speaking...'); // Jimmy is speaking... } } ```

推薦使用線上編輯器 dartpad.cn 進行學習,測試~

Dart 是一門面向物件的程式語言,具備類和基於混入的繼承。所有的類都派生自 Object

面向物件基本特徵

討論面向物件,瞭解它們的特徵,很重要。這也是面試過程中,面試官喜歡考察的一個知識點。

封裝

封裝就是把內部的實現隱藏起來,然後只是暴露必要的方法讓外部呼叫。暴露的方法我們稱之為介面

還是拿剛才的示例來說明:

bash class Person { sayHi(String name) { print(name + ' is speaking...'); // Jimmy is speaking... } }

這裡我知識暴露出了一個 sayHi 的方法,你不需要管裡面是怎麼實現的,實現有多簡單或者多複雜,你只要按照要求呼叫這個介面就行了,比如:

/* * 呼叫 sayHi 介面 * @Function sayHi * @param <String> name * @return void */

繼承

所謂的繼承,就是使得子類具有父類等的各種公開的方法和屬性。比如:

```bash // 父類繼承 void main() { var dog = new Dog('Tom'); dog.sleep(); // Tom must go to sleep. }

class Animal { String name; Animal(this.name); sleep() { print(this.name + ' must go to sleep.'); } }

class Dog extends Animal { Dog(String name) : super(name); barking() { print('Dog is barking.'); } } ```

多型

多型可以理解為相同的行為,不同的實現方式。比如:狗生活 live 在陸地上,魚兒生活 live 在水裡,如下:

```bash void main() { var dog = new Dog(); var fish = new Fish();

dog.live(); // Jimmy living on land.

fish.live(); // Tom living in water. }

// 定義一個抽象類 abstract class Animal { late String name; live(); // 生存 }

class Dog extends Animal { @override String name = 'Jimmy';

@override live() { print(this.name + ' living on land.'); } }

class Fish extends Animal { @override String name = 'Tom';

@override live() { print(this.name + ' living in water.'); } } ```

抽象

我們一般說面向物件的三個特徵:封裝,繼承和多型抽象也是面向物件的一個本質特徵。比如我們上面舉的多型的例子中,我們可以找到 DogFish 的共性,並將他們抽象出來表示。

bash // 定義一個抽象類 abstract class Animal { late String name; // 名字 live(); // 生存(抽象方法) eat() { // 非抽象方法 print('Can eat.'); } }

類宣告

Dart 中,一個類的實現包括類宣告和類體。類宣告的語法格式:

bash [ abstract ] class className [extends superClassName] [implements interfaceName] [with className1, className2, ...] { // 類體 }

  • abstract 表示該類是抽象類,此關鍵字可省略,推薦加上
  • extends 是繼承類的關鍵字,superClassName 是父類類名
  • implements 是實現某個介面的關鍵字,interfaceName 是介面名稱
  • with 是混入多個類的關鍵字,多個類用 , 分隔開

類構成

Dart 中類的構成,包含:

  • 類名
  • 成員變數
  • 成員方法
  • 構造方法

類名

宣告一個類的時候,關鍵字 class 後面的 className 名稱就是類名...

成員變數

宣告類中成員變數的格式,如下:

bash class className { // 成員變數 [static][const][final] type name; }

  • type 是成員變數的資料型別
  • name 是成員變數名
  • [static][const][final] 是成員變數的修飾符
  • static 表示成員變數在類本身可以使用,在類的例項上不可用
  • const 用來定義常量,值不可改變
  • final 表示單一賦值,賦值後不能更改 final 變數的值

⚠️ constfinal 的區別在於:constfinal 更加嚴格。final 只是要求變數在初始化後值不變,但是通過 final 無法在編譯時(執行之前)知道這個變數的值,而 const 是修飾編譯時的常量,從一開始就知道它的值。

成員方法

宣告類中成員方法的格式,如下:

bash class className { // 成員方法 [static][type] methodName(paramType: paramName, ...) [async] { // 方法體 } }

  • type 表示函式方法返回值的資料型別
  • methodName 表示方法名
  • static 是方法修飾符,表示該方法只能是類本身呼叫,不能在例項上可用
  • paramType 表示方法引數型別,paramName 表示方法引數名稱;可以有多個引數,用 , 來分隔開
  • async 表示方法是非同步的

構造方法

構造方法是類中的特殊的方法。在類進行初始化的時候執行,比如:

```bash void main() { var person = new Person('Jimmy', 100); person.sayHi(); // Hello Jimmy. }

class Person { String name = ''; double height = 0.0; // 建構函式 Person(this.name, this.height);

sayHi() { print('Hello ' + this.name + '.'); } } ```

關於建構函式,後面會有文章詳細介紹...

往期精彩推薦

如果讀者覺得文章還可以,不防一鍵三連:關注➕點贊➕收藏