
- Dart程式設計教程
- Dart程式設計 - 首頁
- Dart程式設計 - 概述
- Dart程式設計 - 環境搭建
- Dart程式設計 - 語法
- Dart程式設計 - 資料型別
- Dart程式設計 - 變數
- Dart程式設計 - 運算子
- Dart程式設計 - 迴圈
- Dart程式設計 - 條件語句
- Dart程式設計 - 數字
- Dart程式設計 - 字串
- Dart程式設計 - 布林值
- Dart程式設計 - 列表
- Dart程式設計 - 列表
- Dart程式設計 - 對映
- Dart程式設計 - 符號
- Dart程式設計 - Rune
- Dart程式設計 - 列舉
- Dart程式設計 - 函式
- Dart程式設計 - 介面
- Dart程式設計 - 類
- Dart程式設計 - 物件
- Dart程式設計 - 集合
- Dart程式設計 - 泛型
- Dart程式設計 - 包
- Dart程式設計 - 異常處理
- Dart程式設計 - 除錯
- Dart程式設計 - Typedef
- Dart程式設計 - 庫
- Dart程式設計 - 非同步程式設計
- Dart程式設計 - 併發
- Dart程式設計 - 單元測試
- Dart程式設計 - HTML DOM
- Dart程式設計有用資源
- Dart程式設計 - 快速指南
- Dart程式設計 - 資源
- Dart程式設計 - 討論
Dart程式設計 - 類
Dart 是一種面向物件的語言。它支援面向物件的程式設計特性,例如類、介面等。在 OOP 中,類是建立物件的藍圖。類封裝了物件的資料。Dart 內建支援這種稱為類的概念。
宣告一個類
使用class關鍵字在 Dart 中宣告一個類。類定義以關鍵字 class 開頭,後跟類名;以及由一對花括號括起來的類體。語法如下:
語法
class class_name { <fields> <getters/setters> <constructors> <functions> }
class關鍵字後跟類名。命名類時必須考慮識別符號規則。
類定義可以包括以下內容:
欄位 - 欄位是在類中宣告的任何變數。欄位表示與物件相關的資料。
Setter 和 Getter - 允許程式初始化和檢索類的欄位值。每個類都關聯一個預設的 getter/setter。但是,可以透過顯式定義 setter/getter 來覆蓋預設值。
建構函式 - 負責為類的物件分配記憶體。
函式 - 函式表示物件可以執行的操作。它們有時也稱為方法。
這些元件合在一起被稱為類的資料成員。
示例:宣告一個類
class Car { // field String engine = "E1001"; // function void disp() { print(engine); } }
此示例聲明瞭一個類Car。該類有一個名為engine的欄位。disp()是一個簡單的函式,它列印欄位engine的值。
建立類的例項
要建立類的例項,請使用new關鍵字後跟類名。語法如下:
語法
var object_name = new class_name([ arguments ])
new關鍵字負責例項化。
表示式的右側呼叫建構函式。如果建構函式是引數化的,則應向其傳遞值。
示例:例項化一個類
var obj = new Car("Engine 1")
訪問屬性和函式
可以透過物件訪問類的屬性和函式。使用“.”點表示法(稱為句點)來訪問類的成員。
//accessing an attribute obj.field_name //accessing a function obj.function_name()
示例
檢視以下示例,瞭解如何在 Dart 中訪問屬性和函式:
void main() { Car c= new Car(); c.disp(); } class Car { // field String engine = "E1001"; // function void disp() { print(engine); } }
以上程式碼的輸出如下:
E1001
Dart 建構函式
建構函式是類的特殊函式,負責初始化類的變數。Dart 使用與類名相同的名稱定義建構函式。建構函式是一個函式,因此可以是引數化的。但是,與函式不同,建構函式不能有返回型別。如果不宣告建構函式,則會為您提供預設的無引數建構函式。
語法
Class_name(parameter_list) { //constructor body }
示例
以下示例顯示如何在 Dart 中使用建構函式:
void main() { Car c = new Car('E1001'); } class Car { Car(String engine) { print(engine); } }
它應該產生以下輸出:
E1001
命名建構函式
Dart 提供命名建構函式,使類能夠定義多個建構函式。命名建構函式的語法如下:
語法:定義建構函式
Class_name.constructor_name(param_list)
示例
以下示例顯示如何在 Dart 中使用命名建構函式:
void main() { Car c1 = new Car.namedConst('E1001'); Car c2 = new Car(); } class Car { Car() { print("Non-parameterized constructor invoked"); } Car.namedConst(String engine) { print("The engine is : ${engine}"); } }
它應該產生以下輸出:
The engine is : E1001 Non-parameterized constructor invoked
this 關鍵字
this關鍵字引用類的當前例項。這裡,引數名和類欄位的名稱相同。因此,為了避免歧義,類欄位以this關鍵字為字首。以下示例對此進行了說明:
示例
以下示例說明如何在 Dart 中使用this關鍵字:
void main() { Car c1 = new Car('E1001'); } class Car { String engine; Car(String engine) { this.engine = engine; print("The engine is : ${engine}"); } }
它應該產生以下輸出:
The engine is : E1001
Dart 類 ─ Getter 和 Setter
Getter和Setter,也稱為訪問器和修改器,分別允許程式初始化和檢索類欄位的值。Getter 或訪問器使用get關鍵字定義。Setter 或修改器使用set關鍵字定義。
每個類都關聯一個預設的 getter/setter。但是,可以透過顯式定義 setter/getter 來覆蓋預設值。getter 沒有引數並返回值,而 setter 有一個引數且不返回值。
語法:定義 getter
Return_type get identifier { }
語法:定義 setter
set identifier { }
示例
以下示例顯示如何在 Dart 類中使用getter和setter:
class Student { String name; int age; String get stud_name { return name; } void set stud_name(String name) { this.name = name; } void set stud_age(int age) { if(age<= 0) { print("Age should be greater than 5"); } else { this.age = age; } } int get stud_age { return age; } } void main() { Student s1 = new Student(); s1.stud_name = 'MARK'; s1.stud_age = 0; print(s1.stud_name); print(s1.stud_age); }
此程式程式碼應產生以下輸出:
Age should be greater than 5 MARK Null
類繼承
Dart 支援繼承的概念,即程式能夠從現有類建立新類。用於擴充套件以建立新類的類稱為父類/超類。新建立的類稱為子類/子類。
類使用“extends”關鍵字繼承自另一個類。子類繼承父類中的所有屬性和方法,但建構函式除外。
語法
class child_class_name extends parent_class_name
注意 - Dart 不支援多重繼承。
示例:類繼承
在下面的示例中,我們宣告一個類Shape。該類由Circle類擴充套件。由於類之間存在繼承關係,子類,即Car類,可以隱式訪問其父類的資料成員。
void main() { var obj = new Circle(); obj.cal_area(); } class Shape { void cal_area() { print("calling calc area defined in the Shape class"); } } class Circle extends Shape {}
它應該產生以下輸出:
calling calc area defined in the Shape class
繼承的型別
繼承可以分為以下三種類型:
單繼承 - 每個類最多可以從一個父類繼承。
多繼承 - 一個類可以從多個類繼承。Dart 不支援多重繼承。
多層繼承 - 一個類可以從另一個子類繼承。
示例
以下示例顯示多層繼承的工作方式:
void main() { var obj = new Leaf(); obj.str = "hello"; print(obj.str); } class Root { String str; } class Child extends Root {} class Leaf extends Child {} //indirectly inherits from Root by virtue of inheritance
Leaf類透過多層繼承派生自Root和Child類的屬性。其輸出如下:
hello
Dart – 類繼承和方法覆蓋
方法覆蓋是一種機制,子類透過它重新定義其父類中的方法。以下示例對此進行了說明:
示例
void main() { Child c = new Child(); c.m1(12); } class Parent { void m1(int a){ print("value of a ${a}");} } class Child extends Parent { @override void m1(int b) { print("value of b ${b}"); } }
它應該產生以下輸出:
value of b 12
覆蓋方法時,函式引數的數量和型別必須匹配。如果引數數量或資料型別不匹配,Dart 編譯器會丟擲錯誤。下圖對此進行了說明:
import 'dart:io'; void main() { Child c = new Child(); c.m1(12); } class Parent { void m1(int a){ print("value of a ${a}");} } class Child extends Parent { @override void m1(String b) { print("value of b ${b}"); } }
它應該產生以下輸出:
value of b 12
static 關鍵字
static關鍵字可以應用於類的成員,即欄位和方法。靜態變數保留其值,直到程式執行結束。靜態成員由類名引用。
示例
class StaticMem { static int num; static disp() { print("The value of num is ${StaticMem.num}") ; } } void main() { StaticMem.num = 12; // initialize the static variable } StaticMem.disp(); // invoke the static method }
它應該產生以下輸出:
The value of num is 12
super 關鍵字
super關鍵字用於引用類的直接父類。該關鍵字可以用來引用變數、屬性或方法的超類版本。以下示例對此進行了說明:
示例
void main() { Child c = new Child(); c.m1(12); } class Parent { String msg = "message variable from the parent class"; void m1(int a){ print("value of a ${a}");} } class Child extends Parent { @override void m1(int b) { print("value of b ${b}"); super.m1(13); print("${super.msg}") ; } }
它應該產生以下輸出:
value of b 12 value of a 13 message variable from the parent class