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

GetterSetter,也稱為訪問器修改器,分別允許程式初始化和檢索類欄位的值。Getter 或訪問器使用get關鍵字定義。Setter 或修改器使用set關鍵字定義。

每個類都關聯一個預設的 getter/setter。但是,可以透過顯式定義 setter/getter 來覆蓋預設值。getter 沒有引數並返回值,而 setter 有一個引數且不返回值。

語法:定義 getter

Return_type  get identifier 
{ 
} 

語法:定義 setter

set identifier 
{ 
}

示例

以下示例顯示如何在 Dart 類中使用gettersetter

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
廣告