Dart 知識點 - 面向物件基礎
攜手創作,共同成長!這是我參與「掘金日新計劃 · 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.'); } } ```
抽象
我們一般說面向物件的三個特徵:封裝,繼承和多型。抽象也是面向物件的一個本質特徵。比如我們上面舉的多型的例子中,我們可以找到 Dog
和 Fish
的共性,並將他們抽象出來表示。
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
變數的值
⚠️ const 和 final 的區別在於:
const
比final
更加嚴格。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 + '.'); } } ```
關於建構函式,後面會有文章詳細介紹...
往期精彩推薦
如果讀者覺得文章還可以,不防一鍵三連:關注➕點贊➕收藏
- 前端開發中 5 個很讚的資源
- 懂點心理學 - 馬太效應
- Flutter 構建一個 todo list 應用
- Dart 知識點 - 資料型別
- Dart 知識點 - 混入 Mixin
- Dart 知識點 - 集合 List, Set, Map
- Flutter - 使用 push(), pop() 和路由進行導航
- Dart 知識點 - 面向物件基礎
- Flutter: Stateful 掛件 vs Stateless 掛件
- Flutter 實現登入 UI
- Dart 知識點 - 抽象類和介面
- 自 2020 年以來全球的開源商業化軟體融資情況
- IstioCon 2022 回顧及錄影、PPT 分享
- 網頁實現 1CM 物理長度
- Flutter 開發出現的那些 Bugs 和解決方案「持續更新... 」
- 仿寫新聞客戶端
- Beyond Istio OSS —— Istio 服務網格的現狀及未來
- 在外企的工作生活「年中總結」
- 如何在 Istio 中整合 SPRIRE?
- Javascript尾遞迴程式設計