- 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