Flutter 中的三種關系:
- 1出皇、繼承(關鍵字
extends
) - 2、混入 mixins (關鍵字
with
) - 3哗戈、接口實現(xiàn)(關鍵字
implements
) - 這三種關系可以同時存在郊艘,但是有前后順序:extends -> mixins -> implements。extens在前唯咬,mixins在中間纱注,implements最后。
類
- Dart所有的東西都是對象胆胰,所有的對象都繼承自Object類狞贱。
- Dart是一門使用類和單繼承的面向對象語言,所有的對象都是類的實例蜀涨,并且所有的類都是Object的子類瞎嬉。
構造函數(shù)
默認構造函數(shù)
- dart的默認構造函數(shù)只能有一個,由類名+(參數(shù)s){}構成
Person(String name,int age){this.name = name; this.age = age;}
- 默認構造函數(shù)簡寫格式為類名+(接收參數(shù)的屬性s)
Person(this.name, this.age);// 將接收到的第一個參數(shù)賦值給this.name,接收到的第二個參數(shù),賦值給this.age厚柳,等同于上面的Person(String name,int age){this.name = name; this.age = age;}
命名構造函數(shù)
- dart 中命名構造函數(shù)可以有多個
- 命名構造函數(shù)格式為類名.函數(shù)名(參數(shù)s) { }
Person.student(){函數(shù)體}
氧枣。使用命名構造函數(shù)生成一個實例:Person p = new Person.student();
Dart中的私有屬性和方法
- dart中沒有public、private别垮、protected訪問修飾符
- dart中使用下劃線(_)將一個屬性或者方法變?yōu)樗接斜慵唷P枰⒁獾氖羌恿讼聞澗€的私有屬性或者方法依然可以被當前文件中的其他類訪問,只是不能被別的文件中的模塊訪問碳想。如果需要只能當前類訪問烧董,需要將該類放到一個單獨的文件中
。
getter 和 setter
class Rect{
num height;
num width;
//Rect(this.height,this.width);
Rect():height=2,width=10{//在構造函數(shù)體運行之前初始化實例變量
}
get area{
return this.height*this.width;
}
set areaHeight(value){
this.height=value;
}
}
靜態(tài)成員和靜態(tài)方法
- dart中使用static關鍵字來實現(xiàn)類級別的變量和函數(shù)
- 靜態(tài)方法不能訪問非靜態(tài)成員胧奔,非靜態(tài)成員方法可以訪問靜態(tài)成員
class Person {
static String name = '張三';
int age=20;
static void show() {
print(name);
}
void printInfo(){ /*非靜態(tài)方法可以訪問靜態(tài)成員以及非靜態(tài)成員*/
print(name); //訪問靜態(tài)屬性
print(this.age); //訪問非靜態(tài)屬性
show(); //調用靜態(tài)方法
}
static void printUserInfo(){//靜態(tài)方法
print(name); //靜態(tài)屬性
show(); //靜態(tài)方法
// print(this.age); //靜態(tài)方法沒法訪問非靜態(tài)的屬性 報錯
// this.printInfo(); //靜態(tài)方法沒法訪問非靜態(tài)的方法 報錯
// printInfo(); //靜態(tài)方法沒發(fā)訪問非靜態(tài)的方法 報錯
Person p = Person();
p.printInfo();
}
}
繼承
- 子類使用extends關鍵詞來繼承父類
- 子類會繼承父類里面可見的屬性和方法 但是不會繼承構造函數(shù)(默認構造函數(shù)和命名構造函數(shù))
- 子類能復寫父類的方法 getter和setter
- 子類重寫父類方法時用@override關鍵字逊移,默認不用也可以,一般建議使用
- 子類中使用super關鍵字調用父類方法
class Person {
String name;
num age;
Person(this.name,this.age);
void printInfo() {
print("${this.name}---${this.age}");
}
}
class Web extends Person{
Web(String name, num age) : super(name, age){ //子類實現(xiàn)自己的構造方法葡盗,同時調用父類的構造方法
}
}
抽象類
- Dart抽象類主要用于定義標準螟左,子類可以繼承抽象類啡浊,也可以實現(xiàn)抽象類接口觅够。
- 抽象類通過abstract 關鍵字來定義
- Dart中的抽象方法不能用abstract聲明,Dart中沒有方法體的方法我們稱為抽象方法巷嚣。
- 如果子類繼承抽象類必須得實現(xiàn)里面的抽象方法
- 如果把抽象類當做接口實現(xiàn)的話必須得實現(xiàn)抽象類里面定義的所有屬性和方法喘先。
- 抽象類不能被實例化,只有繼承它的子類可以
extends抽象類 和 implements的區(qū)別:
- 如果要復用抽象類里面的方法廷粒,并且要用抽象方法約束自類的話我們就用extends繼承抽象類
- 如果只是把抽象類當做標準的話我們就用implements實現(xiàn)抽象類
abstract class Animal{
eat(); //抽象方法
run(); //抽象方法
printInfo(){
print('我是一個抽象類里面的普通方法');
}
}
class Dog extends Animal{
@override
eat() {
print('小狗在吃骨頭');
}
@override
run() {
print('小狗在跑');
}
}
class Cat extends Animal{
@override
eat() {
print('小貓在吃老鼠');
}
@override
run() {
print('小貓在跑');
}
}
Dart 中的多態(tài)
- 允許將子類類型的指針賦值給父類類型的指針, 同一個函數(shù)調用會有不同的執(zhí)行效果 窘拯。
- 子類的實例賦值給父類的引用红且。
- 多態(tài)就是父類定義一個方法不去實現(xiàn),讓繼承他的子類去實現(xiàn)涤姊,每個子類有不同的表現(xiàn)暇番。
Dart中的接口
- dart的接口沒有interface關鍵字定義接口,而是普通類或抽象類都可以作為接口被實現(xiàn)思喊。
- 使用implements關鍵字進行實現(xiàn)
- 如果實現(xiàn)的類是普通類壁酬,會將普通類和抽象中的屬性的方法全部需要覆寫一遍。因為抽象類可以定義抽象方法恨课,普通類不可以.
Dart 中的接口
- 一個類實現(xiàn)多個接口
abstract class A{
String name;
printA();
}
abstract class B{
printB();
}
class C implements A,B{
@override
String name;
@override
printA() {
print('printA');
}
@override
printB() {
return null;
}
}
Dart 中的混入
- mixins意思是混入舆乔,就是在類中混入其他功能。
- 在Dart中可以使用mixins實現(xiàn)類似多繼承的功能
- mixins使用的條件剂公,隨著Dart版本一直在變希俩,這里說的是Dart2.x中使用mixins的條件:
1、作為mixins的類只能繼承自Object纲辽,不能繼承其他類
2颜武、作為mixins的類不能有構造函數(shù)
3、一個類可以mixins多個mixins類
4拖吼、mixins絕不是繼承盒刚,也不是接口,而是一種全新的特性
class Person{
String name;
num age;
Person(this.name,this.age);
printInfo(){print('${this.name}----${this.age}');}
void run(){print("Person Run");}
}
class A {
String info="this is A";
void printA(){ print("A");}
void run(){print("run")}
}
class B {
void printB(){print("B");}
void run(){print("B Run");}
}
class C extends Person with B,A{
C(String name, num age) : super(name, age);
}
- mixins的類型就是其超類的子類型绿贞。
class A {
String info="this is A";
void printA(){
print("A");
}
}
class B {
void printB(){
print("B");
}
}
class C with A,B{
}
void main(){
var c=new C();
print(c is C); //true
print(c is A); //true
print(c is B); //true
}
抽象類
抽象方法:在Dart中沒有具體實現(xiàn)的方法(沒有方法體)因块,就是抽象方法,抽象方法必須存在于抽象類中
抽象類里的方法可以有實現(xiàn)籍铁,也可以僅僅聲明
抽象類使用abstract聲明
external 的作用: 可以是方法的聲明和實現(xiàn)分離涡上,這樣多的好處是可以針對不同平臺做不同實現(xiàn)
注意一:抽象類不能實例化。我們的Map雖然是個抽象類拒名,但是可以創(chuàng)造Map實例(var map = Map()),是因為Map提供了一個工廠方法(返回一個子類實例)吩愧;源碼為: external factory Map(); 在dart的源碼中可以看到實現(xiàn)為: factory Map() => LinkedHashMap<K,V>();
注意二:抽象類中的抽象方法必須被子類實現(xiàn), 抽象類中的已經(jīng)被實現(xiàn)方法, 可以不被子類重寫.隱式接口
Dart中的接口比較特殊, 沒有一個專門的關鍵字來聲明接口.
默認情況下,定義的每個類都相當于默認也聲明了一個接口增显,可以由其他的類來實現(xiàn)(因為Dart不支持多繼承)
在開發(fā)中雁佳,我們通常將用于給別人實現(xiàn)的類聲明為抽象類:
abstract class Run {
run();
}
class Fly { // 這里我們也可以把Fly類當做一個接口
print('fly');
}
}
class SuperMan implements Run, Fly { // implements用來實現(xiàn)接口,實現(xiàn)的接口不可以調super方法
@override
run() {
print('超人在奔跑');
}
@override
fly() {
print("fuperman fly");
}
}
- 混入(Mixin)
在通過implements實現(xiàn)某個類時,類中所有的方法都必須被重新實現(xiàn)(無論這個類原來是否已經(jīng)實現(xiàn)過該方法)同云。
但是某些情況下糖权,一個類可能希望直接復用之前類的原有實現(xiàn)方案,怎么做呢?
使用繼承嗎炸站?但是Dart只支持單繼承星澳,那么意味著你只能復用一個類的實現(xiàn)。
Dart提供了另外一種方案: Mixin混入的方式
除了可以通過class定義類之外旱易,也可以通過mixin關鍵字來定義一個類禁偎。
只是通過mixin定義的類用于被其他類混入使用腿堤,通過with關鍵字來進行混入。
mixin Runner {
run() {
print('在奔跑');
}
}
mixin Flyer {
fly() {
print('在飛翔');
}
}
// implements的方式要求必須對其中的方法進行重新實現(xiàn)
// class SuperMan implements Runner, Flyer {}
class SuperMain with Runner, Flyer {
}
調用順序如暖,有自己的實現(xiàn)用自己的實現(xiàn)笆檀,沒有自己的實現(xiàn)用混入的實現(xiàn),沒有混入的實現(xiàn)用繼承的實現(xiàn)盒至,如果都沒有就報方法找不到的錯誤了