Dart 中的類 抽象類 多態 繼承 接口 以及 Mixins

09 Dart中的對象 類

09-1 對象 類

  • 面向對象編程(OOP)的三個基本特徵是:封裝、繼承、多態sql

    • 封裝:封裝是對象和類概念的主要特性。封裝,把客觀事物封裝成抽象的類,而且把本身的部分屬性和方法提供給其餘對象調用, 而一部分屬性和方法則隱藏。
    • 繼承:面向對象編程 (OOP) 語言的一個主要功能就是「繼承」。繼承是指這樣一種能力:它可使用現有類的功能,並在無需從新編寫原來的類的狀況下對這些功能進行擴展。
    • 多態:容許將子類類型的指針賦值給父類類型的指針, 同一個函數調用會有不一樣的執行效果 。
  • Dart全部的東西都是對象,全部的對象都繼承自Object類。數據庫

  • Dart是一門使用類和單繼承的面嚮對象語言,全部的對象都是類的實例,而且全部的類都是Object的子類編程

  • 一個類一般由屬性和方法組成。ide

class Person {
    // String name = '張三';
    // int age = 32;
    String name;
    int age;

    // 構造函數在實例化的時候觸發
    // Person() {
      // print('構造函數在實例化的時候觸發');
    // }

    // Person(String name, int age) {
      // this.name = name;
      // this.age = age;
    // }

    Person(this.name, this.age);

    // 命名構造函數
    Person.setInfo(String name, int age) {
      this.name = name;
      this.age = age;
    }

    void getInfo() {
      print('${this.name}---${this.age}');
    }

    void setInfo(int age) {
      this.age = age;
    }
  }

  void main() {
    Person p2 = new Person('Hiraku', 29);
    p2.setInfo(28);
    p2.getInfo();

    Person p3 = new Person.setInfo('Hiraku', 29);
    p3.getInfo();
  }
複製代碼

09-2 私有屬性

  • dart 中沒有私有屬性和私有方法,不像其餘面向對象的語言有 public private protected 等修飾符
  • 將類單獨抽離到一個文件夾,而後加上 _ 表示私有屬性

09-3 類中的 setter 和 getter

  • setter
class Reac {
  num height;
  num width;

  Reac(this.height, this.width);

  get area {
    return this.height * this.width;
  }
}

void main() {
  Reac r = new Reac(8, 16);

  print('面積:${r.area}');
}
複製代碼
  • getter
class Reac {
  num height;
  num width;

  Reac(this.height, this.width);

  set reacHeight(num val) {
    this.height = val;
  }

  get area {
    return this.height * this.width;
  }
}

void main() {
  Reac r = new Reac(8, 16);
  r.reacHeight = 1;

  print('面積:${r.area}');
}
複製代碼

09-4 類裏面的初始化列表

class Reac {
  num height;
  num width;

  Reac():height = 20, width = 30{
    print('${this.height}===${this.width}');
  }

  set reacHeight(num val) {
    this.height = val;
  }

  get area {
    return this.height * this.width;
  }
}

void main() {
  Reac r = new Reac();

  print('面積:${r.area}');
}
複製代碼

10 Dart中的類 靜態成員 操做符 類的繼承

10-1 Dart中的靜態成員:

  • 一、使用static 關鍵字來實現類級別的變量和函數
  • 二、靜態方法不能訪問非靜態成員,非靜態方法能夠訪問靜態成員
class Person {
  static String name = '張三';
  static void show() {
    print(name);
  }
}

void main() {
  print(Person.name);
  Person.show();  
}
複製代碼
class Person {
  static String name = '張三';
  int age=20;
  
  static void show() {
    print(name);
  }
  void printInfo() {  /*非靜態方法能夠訪問靜態成員以及非靜態成員*/
    // print(name); // 訪問靜態屬性
    // print(this.age); // 訪問非靜態屬性

    show();   // 調用靜態方法
  }
  static void printUserInfo() {// 靜態方法
    print(name);   // 靜態屬性
    show();        // 靜態方法

    // print(this.age); // 靜態方法無法訪問非靜態的屬性
    // this.printInfo(); // 靜態方法無法訪問非靜態的方法
    // printInfo();
  }
}

void main() {
  // print(Person.name);
  // Person.show(); 

  // Person p = new Person();
  // p.printInfo(); 

  Person.printUserInfo();
}
複製代碼

10-2 Dart中的對象操做符

  • ? 條件運算符 (瞭解)
  • as 類型轉換
  • is 類型判斷
  • .. 級聯操做 (連綴) (記住)
class Person {
    String name;
    int age;
    Person(this.name, this.age);

    printInfo() {
      print('${this.name}--${this.age}');
    }
  }

  void main() {
    Person p;
    p.printInfo(); // 報錯

    p?.printInfo();

    print(p is Person); // true
    print(p is Object); // true
  }

  void main() {
    var p1;
    p1 = '';
    p1 = new Person();
    (p1 as Person).printInfo();
  }

  void main() {
    Person p1 = new Person('Hiraku', 29);
    p1.printInfo(); // Hiraku--29

    p1.name = '馬紅琴';
    p1.age = 18;
    pi.printInfo(); // 馬紅琴--18

    p1..name = '馬紅琴'
      ..age = 18
      ..pringInfo(); // 馬紅琴--18
  }
複製代碼

10-3 面向對象的三大特性:封裝 、繼承、多態

  • Dart中的類的繼承:
    • 一、子類使用 extends 關鍵詞來繼承父類
    • 二、子類會繼承父類裏面可見的屬性和方法 可是不會繼承構造函數
    • 三、子類能複寫父類的方法 gettersetter
class Person {
  String name;
  int age;

  Person(this.name, this.age);
  Person.work(this.name) { // 命名構造函數
    print('${this.name} is working');
  };

  void printInfo() {
    print('${this.name}--${this.age}');
  }

  void isJoking() {
    print('${this.name}---is joking');
  }
}

class Web extends Person {
  String sex;

  Web(String name, int age, String sex) : super(name, age) {
    this.sex = sex;
  }

  void printFun() {
    print('${this.name}--${this.age}--${this.sex}');
  }
}

class Design extends Person {
  String sex;

  Design(String name, int age, String sex) : super.work(name) {
    this.age = age;
    this.sex = sex;
  }

  void printFun() {
    super.isJoking(); // 子類調用父類的方法
    print('${this.name}--${this.age}--${this.sex}');
  }

  @overage
  void printInfo() { // 複寫父類方法
    print('姓名:${this.name}');
  }
}

void main() {
  Web w = new Web('Hiraku', 29, '女');
  Design d = new Design('Hiraku', 29, '女');

  w.printFun();
  d.printFun();
}
複製代碼

11 Dart中的抽象類 多態 以及接口

11-1 Dart 中的抽象類

  • Dart中抽象類: Dart 抽象類主要用於定義標準,子類能夠繼承抽象類,也能夠實現抽象類接口。函數

    • 一、抽象類經過 abstract 關鍵字來定義
    • 二、Dart 中的抽象方法不能用 abstract 聲明,Dart 中沒有方法體的方法咱們稱爲抽象方法。
    • 三、若是子類繼承抽象類必須得實現裏面的抽象方法
    • 四、若是把抽象類當作接口實現的話必須得實現抽象類裏面定義的全部屬性和方法。
    • 五、抽象類不能被實例化,只有繼承它的子類能夠
  • extends 抽象類和 implements 的區別:ui

    • 一、若是要複用抽象類裏面的方法,而且要用抽象方法約束自類的話咱們就用 extends 繼承抽象類
    • 二、若是隻是把抽象類當作標準的話咱們就用 implements 實現抽象類

11-2 Dart 中的多態

  • 容許將子類類型的指針賦值給父類類型的指針, 同一個函數調用會有不一樣的執行效果
  • 子類的實例賦值給父類的引用
  • 多態就是父類定義一個方法不去實現,讓繼承他的子類去實現,每一個子類有不一樣的表現
abstract class Animal { // 抽象類用 abstract 定義
  Animal();
  eat(); // 抽象方法,主要用來約束子類,不能使用 abstract 定義,而是沒有方法體的方式定義抽象方法
  run();

  printCommonFunc() {
    print('我是抽象類的抽象方法');
  }
}

class Dog extends Animal {
  @override
  eat() { // 必須得實現抽象方法
    print('小狗在吃骨頭');
  }

  @override
  run() {
    print('小狗在遛彎');
  }

  printInfo() {
    print('我是小狗');
  }
}

class Cat extends Animal {
  @override
  eat() {
    print('小貓在吃貓食');
  }

  @override
  run() {
    print('小貓在散步');
  }

  printInfo() {
    print('我是小貓咪');
  }
}

void main() {
  Dog d = new Dog();
  d.eat();
  d.run();

  Cat c = new Cat();
  c.eat();
  c.run();

  Animal animalDog = new Dog();
  animalDog.eat();
  animalDog.printCommonFunc();
  // animalDog.printInfo(); // 報錯,由於子類的實例賦值給父類的引用

  Animal animalCat = new Cat();
  animalCat.eat();
}
複製代碼

11-4 dart 中的接口

  • 和Java同樣,dart也有接口,可是和Java仍是有區別的
    • 首先,dart 的接口沒有 interface 關鍵字定義接口,而是普通類或抽象類均可以做爲接口被實現
    • 一樣使用 implements 關鍵字進行實現
    • 可是 dart 的接口有點奇怪,若是實現的類是普通類,會將普通類和抽象中的屬性的方法所有須要覆寫一遍
    • 而由於抽象類能夠定義抽象方法,普通類不能夠,因此通常若是要實現像Java接口那樣的方式,通常會使用抽象類
    • 建議使用抽象類定義接口
abstract class Db {  // 看成接口:規範 規定
  String uri;  // 數據庫鏈接地址
  add();
  save();
  delete();
}

class Mysql implements Db {
  @override
  String uri;

  @override
  add() {
    // TODO: implement add
    return null;
  }

  @override
  delete() {
    // TODO: implement delete
    return null;
  }

  @override
  save() {
    // TODO: implement save
    return null;
  }
  
}

class MongoDb implements Db {
  @override
  String uri;

  @override
  add() {
    // TODO: implement add
    return null;
  }

  @override
  delete() {
    // TODO: implement delete
    return null;
  }

  @override
  save() {
    // TODO: implement save
    return null;
  }
  
}
複製代碼

12 Dart中一個類實現多個接口以及 Dart 中的 Mixins

12-1 實現多個接口

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();

}
複製代碼

12-2 實現多個接口

  • mixins 的中文意思是混入,就是在類中混入其餘功能
  • 在 Dart 中可使用 mixins 實現相似多繼承的功能
  • 由於 mixins 使用的條件,隨着 Dart 版本一直在變,這裏講的是D art2.x 中使用 mixins 的條件:
    • 一、做爲 mixins 的類只能繼承自 Object,不能繼承其餘類
    • 二、做爲 mixins 的類不能有構造函數
    • 三、一個類能夠 mixins 多個 mixins 類
    • 四、mixins 毫不是繼承,也不是接口,而是一種全新的特性
class Animal {
  String name;
  int age;
  Animal(this.name, this.age);

  funcAnimal() {
    print('${this.name}--${this.age}');
  }
}
class A {
  String info = 'This is a attribute in A';

  funcA() {
    print('我是 A');
  }
}

class B {
  funcB() {
    print('我是 B');
  }
}

class C extends Animal with A, B {
  C(String name, int age) : super(name, age);
  funcC() {
    print('我是 C 的方法');
  }
}

void main() {
  C c = new C('小貓', 3);
  c.funcA();
  c.funcB();
  c.funcC();
  c.funcAnimal();
  print(c.info);

  print(c is A); // true
  print(c is Animal); // true
}
複製代碼
相關文章
相關標籤/搜索