Dart2基礎 八 類和列舉

2021-08-28 16:23:25 字數 4714 閱讀 2517

目錄

類的定義和使用

獲取物件型別

例項變數

建構函式

子類建構函式

重定向建構函式

靜態建構函式

工廠建構函式

例項方法

抽象類和方法

隱式介面

類的繼承

過載運算子 列舉

mixins

類變數和方法

dart2中的類都是繼承於類object。dart2中每乙個類都有有乙個超類(object除外),但是乙個類的主體可以在多個類層次中使用。

dart2中使用關鍵字class定義類,用.和?.呼叫類的成員。?.的用法是當物件不為空時,呼叫成員,為空時,跳過不呼叫。

class animal

run() is running");

}}main(listargs)

每乙個物件都有乙個runtimetype的屬性,通過這個屬性可以獲取到該物件的型別(type的物件)。

class animal(){}

main()

每乙個例項變數都有乙個隱式的get方法,如果變數不是final型別的,那麼例項變數會有乙個隱式的set方法。

如果乙個例項變數有初始值,那麼它的值在構造方法生效之前,就已經被賦予。

如果想重寫get和set方法,可以用關鍵字get和set實現。

dart2中以_開頭的變數和方法,都是私有的。

// 官網例項**

class rectangle

void main()

建構函式的定義,可以通過函式名為classname和classname.identifier(命名的建構函式 named constructors)定義。

通過命名的建構函式可以輕鬆實現多個不同的建構函式。

如果類沒有建構函式,那麼缺省會有乙個沒有引數的建構函式。

class animal

// 上面的建構函式,可以簡寫為

animal(this.name);

animal.createinstance(map values)

run() is running");

}}main(listargs) );

print(animal.name);

}

父類中的命名建構函式不能被子類繼承。如果想要子類也擁有乙個父類一樣名字的建構函式,必須在子類是實現這個建構函式。預設情況下,子類只能呼叫父類的無名,無引數的建構函式。父類的無名建構函式會在子類的建構函式前呼叫。如果initializer list 也同時定義了,則會先執行initializer list 中的內容,然後在執行父類的無名無引數建構函式,最後呼叫子類自己的無名無引數建構函式。即下面的順序:

initializer list(初始化列表)

superclass』s no-arg constructor

main class』s no-arg constructor

如果父類不顯示提供無名無引數建構函式的建構函式,在子類中必須顯式呼叫父類的乙個建構函式。這種情況下,呼叫父類的建構函式的**放在子類建構函式名後,子類建構函式體前,中間使用:(colon) 分割。

在開發狀態下,初始化列表可以使用assert表示式。

class animal

run() is running");

}}// extends 繼承的關鍵字

class bird extends animal

}main(listargs) );

print(bird.name); // bird

print(bird.desc); // blue bird

}

所謂重定向建構函式,是指在乙個建構函式中指向另乙個建構函式,但是重定向建構函式的函式體是空的。以官網**為例。

class point
如果類的物件不會有任何變化,那麼可以讓這些物件是編譯時常量。通過建立靜態建構函式,並且所有成員屬性是final的來實現。

靜態建構函式,並不是都會返回乙個編譯時常量。

class animal

main(listargs) ;

// 上面的**可以寫成下面這樣,這是dart2的新特性

const cats2 = ;

}

使用關鍵字final實現工廠建構函式。工廠建構函式可以讓你不必要每次都建立乙個新的物件,就好像是有乙個快取,快取了老的物件。

工廠建構函式中不能使用this。

下面是官網的例項:

class logger ;

factory logger(string name) else

} logger._internal(this.name);

void log(string msg)

}}void main()

例項方法是物件中的函式。例項方法中可以使用例項變數和this。

class animal() is running");

}}

使用關鍵字abstract宣告的類,就是抽象類。抽象方法是沒有實現體的方法,抽象方法只能存在於抽象類中。

例項方法、setter和getter方法都可以是抽象方法。

抽象類不能被例項化。如果想要抽象類進行例項化,可以用工廠建構函式實現。

抽象類通常用來定義介面。

abstract class animal

class bird extends animal $ is flying");

}}main(listargs)

dart2中的每乙個類都有乙個隱式的介面,這個隱式的介面包含所有的例項成員和實現的介面的例項成員。

如果你想建立乙個類a支援類b的api函式,但是不想繼承b的實現,則類a需要繼承類b的介面。

繼承介面的關鍵字是implements, 乙個類可以繼承多個介面。

class animal is running");

}}// 實現animal的介面,如果還有其他的介面,可以用,分割 implements animal, ...

class bird implements animal can not run");

}}runninganimal(animal animal)

main(listargs)

使用extends來繼承父類,super來指定父類。

子類可以過載父類的例項方法、setter和getter,使用@override注釋重新的方法。

過載nosuchmethod() 方法,可以在物件檢視呼叫不存在的方法或者變數時呼叫。但是,你不能呼叫乙個不存在的方法,除非是以下情況的一種:

1. 乙個靜態型別的dynamic的變數;

2. 接收方有乙個定義未實現的方法的靜態型別(抽象的也可以),並且接收方是dynamic並且有乙個nosuchmethod()的實現,與類object中的實現不同。

class animal

run() is running");

}}// extends 繼承的關鍵字

class bird extends animal

@override

run() can not run");

} @override

void nosuchmethod(invocation invocation) ');

}}

可以過載的運算子有:

<+|

>/^=

<=~/&~

>=*<<==

%>>

class person

}main(listargs)

列舉型別是一種特殊的類,通常用來表示相同型別的一組常量。使用關鍵字enum定義列舉。

列舉的每乙個值都有乙個index屬性,index從0開始計數。

列舉不能被繼承,不能建立例項。

enum animal 

main(listargs)

// animal is dog

}

mixins是給類新增新的特性的方式,也是一種重用類**的一種方式。

mixins的關鍵字是with。詳細的使用,可以檢視文件。

with不能單獨使用,必須跟著extends使用。

class fly

}class animal{}

class bird extends animal with fly

main(listargs)

使用關鍵字static,宣告類變數和類方法

class animal

}main(listargs)

Dart基礎語法 八 類(中)

本節主要記錄一下dart中關於類的使用 getters 和 settersclass rect void main 可覆寫的操作符 即使用關鍵字operator重新定義已有操作符的實現邏輯 如list就重寫了 以下是支援覆寫的操作符 import dart math class rect void ...

Dart2基礎 九 泛型

目錄 為什麼使用泛型?用於集合型別 限制泛型引數型別 泛型 generics 使用 來定義。按照慣例,dart2中使用e t k和v宣告型別變數。比如 list等等。1.指定泛型型別,可以是 更安全,更易解讀 2.使用泛型還可以避免 重複。官網 abstract class objectcache ...

C 學習(八) 類和物件(三)

include include using namespace std 系統提供的拷貝函式,只會做簡單的值拷貝 如果類中有屬性開闢到堆區,那麼在釋放的時候,由於淺拷貝問題導致堆區內容會重複釋放程式down掉 利用深拷貝 解決淺拷貝帶來的問題 class persion persion const p...