類薯鼠、抽象類、接口械蹋、混入

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)盒至,如果都沒有就報方法找不到的錯誤了

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末误债,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子妄迁,更是在濱河造成了極大的恐慌寝蹈,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件登淘,死亡現(xiàn)場離奇詭異箫老,居然都是意外死亡,警方通過查閱死者的電腦和手機黔州,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門耍鬓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人流妻,你說我怎么就攤上這事牲蜀。” “怎么了绅这?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵涣达,是天一觀的道長。 經(jīng)常有香客問我证薇,道長度苔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任浑度,我火速辦了婚禮寇窑,結果婚禮上,老公的妹妹穿的比我還像新娘箩张。我一直安慰自己壹哺,他們只是感情好筛璧,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布林束。 她就那樣靜靜地躺著判导,像睡著了一般。 火紅的嫁衣襯著肌膚如雪熟掂。 梳的紋絲不亂的頭發(fā)上缎浇,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天扎拣,我揣著相機與錄音赴肚,去河邊找鬼素跺。 笑死,一個胖子當著我的面吹牛誉券,可吹牛的內容都是我干的指厌。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼踊跟,長吁一口氣:“原來是場噩夢啊……” “哼踩验!你這毒婦竟也來了?” 一聲冷哼從身側響起商玫,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤箕憾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拳昌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體袭异,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年炬藤,在試婚紗的時候發(fā)現(xiàn)自己被綠了御铃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡沈矿,死狀恐怖上真,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情羹膳,我是刑警寧澤睡互,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站陵像,受9級特大地震影響湃缎,放射性物質發(fā)生泄漏。R本人自食惡果不足惜蠢壹,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一嗓违、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧图贸,春花似錦蹂季、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沟优,卻和暖如春涕滋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背挠阁。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工宾肺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留溯饵,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓锨用,卻偏偏與公主長得像丰刊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子增拥,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內容