目錄
類的定義和使用
獲取物件型別
例項變數
建構函式
子類建構函式
重定向建構函式
靜態建構函式
工廠建構函式
例項方法
抽象類和方法
隱式介面
類的繼承
過載運算子 列舉
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...