【轉(zhuǎn)】dart中extends、 implements、with的用法與區(qū)別

原文鏈接

一、概述

  • 繼承(關(guān)鍵字 extends)
  • 混入 mixins (關(guān)鍵字 with)
  • 接口實(shí)現(xiàn)(關(guān)鍵字 implements)

這三種關(guān)系可以同時(shí)存在,但是有前后順序:

extens在前,mixins在中間,implements最后;

二、實(shí)戰(zhàn)

2.1 繼承(extends)

dart中的繼承規(guī)則:

  • 子類(lèi)使用extends關(guān)鍵詞來(lái)繼承父類(lèi)
  • 子類(lèi)會(huì)繼承父類(lèi)里面可見(jiàn)的屬性和方法 但是不會(huì)繼承構(gòu)造函數(shù)
  • 子類(lèi)能復(fù)寫(xiě)父類(lèi)的方法 getter和setter
  • 子類(lèi)重寫(xiě)超類(lèi)的方法,要用@override
  • 子類(lèi)調(diào)用超類(lèi)的方法,要用super
  • 子類(lèi)可以繼承父類(lèi)的非私有變量

栗子舉起來(lái):

class Person { //公有變量
 String name; 
  num age; //私有變量
 String _gender; //類(lèi)名構(gòu)造函數(shù)
  Person(this.name,this.age); //公有的方法
  void printInfo() {
    print("${this.name}---${this.age}");  
  }

  work(){
    print("${this.name}在工作...");
  }
} 

class Web extends Person{
 Web(String name, num age) : super(name, age);
  run(){
    print('run');
    super.work(); //自類(lèi)調(diào)用父類(lèi)的方法
 } //覆寫(xiě)父類(lèi)的方法

  @override       //可以寫(xiě)也可以不寫(xiě)  建議在覆寫(xiě)父類(lèi)方法的時(shí)候加上 @override 
  void printInfo(){
     print("姓名:${this.name}---年齡:${this.age}"); 
  }
}

main(){ 
  Web w =n ew Web('李四',20); // w.printInfo();
 w.run();
}

2.2 混合 mixins (with)

mixins的中文意思是混入,就是在類(lèi)中混入其他功能。在Dart中可以使用mixins實(shí)現(xiàn)類(lèi)似多繼承的功能因?yàn)?strong>mixins使用的條件,隨著Dart版本一直在變,這里說(shuō)的是Dart2.x中使用mixins的條件:

  • (1) 作為mixins的類(lèi)只能繼承自O(shè)bject,不能繼承其他類(lèi)
  • (2) 作為mixins的類(lèi)不能有構(gòu)造函數(shù)
  • (3) 一個(gè)類(lèi)可以mixins多個(gè)mixins類(lèi)
  • (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("A 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);
}

void main(){  
  var c = new C('張三',20);  
  c.printInfo();
  // c.printB();
  // print(c.info);
  c.run();
}

2.3 接口實(shí)現(xiàn)(implements)

Flutter是沒(méi)有interface的,但是Flutter中的每個(gè)類(lèi)都是一個(gè)隱式的接口,這個(gè)接口包含類(lèi)里的所有成員變量,以及定義的方法。如果有一個(gè)類(lèi) A,你想讓類(lèi)B擁有A的API,但又不想擁有A里的實(shí)現(xiàn),那么你就應(yīng)該把A當(dāng)做接口,類(lèi)B implements 類(lèi)A.
  所以在Flutter中:class 就是 interface

  • 當(dāng)class被當(dāng)做interface用時(shí),class中的方法就是接口的方法,需要在子類(lèi)里重新實(shí)現(xiàn),在子類(lèi)實(shí)現(xiàn)的時(shí)候要加@override
  • 當(dāng)class被當(dāng)做interface用時(shí),class中的成員變量也需要在子類(lèi)里重新實(shí)現(xiàn)。在成員變量前加@override
/*
Dart中一個(gè)類(lèi)實(shí)現(xiàn)多個(gè)接口:
*/

abstract class A{
  String name;
  printA();
}

abstract class B{
  printB();
}

class C implements A,B{  
  @override
  String name;  
  @override
  printA() {
    print('printA');
  }
  @override
  printB() {
    // TODO: implement printB
    return null;
  }
}

void main(){
  C c=new C();
  c.printA();
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容