一文讓你看懂dart中的類|8月更文挑戰

我的div丟了腫麼辦發表於2021-08-01

dart是一門物件導向的語言

dart是一門實用類和單繼承的物件導向的語言
在dart中所有的物件都是類的例項。
所有的類都是Object的子類
類都是有屬性和方法組成的
複製程式碼

定義一個類

在dart中,我們可以通過關鍵字class來定義類
類名通常首字母是你大寫的。採用的是大駝峰的方式。
如果我們定的是函式或者方法。我們首字母是小寫的;採用小駝峰的方式
我們剛剛說了:類通常是由屬性和方法組成的。下面我們就實現一個類
複製程式碼

實現一個簡單的類

class PersonIno {
  // 類中的屬性
  String name = '林漾';
  int age = 30;
  // 類中的方法
  likes() {
    print('喜歡逛街');
  }

  // 訪問類中的屬性
  info() {
    // 直接訪問屬性
    print('我叫 $name,今年$age');

    // 通過this的來訪問屬性
    print('我叫 ${this.name},今年${this.age}');
  }
}
複製程式碼

使用類之前進行例項化

void main() {
  //例項化
  var p = new PersonIno();
  //呼叫類中的方法
  p.info();
  print(p.name);

  // 我們也可以宣告這個p的型別哈;PersonIno型別
  PersonIno p1 = new PersonIno();
}
複製程式碼

dart中的建構函式

class PersonIno {
  // 類中的屬性
  String name = '林漾';
  int age = 30;

  // 建構函式的名稱和型別相同
  PersonIno() {
    print('我是建構函式,在例項化的時候就會被觸發');
  }

  // 類中的方法
  likes() {
    print('喜歡逛街');
  }

  // 訪問類中的屬性
  info() {
    // 直接訪問屬性
    print('我叫 $name,今年$age');

    // 通過this的來訪問屬性
    print('我叫 ${this.name},今年${this.age}');
  }
}
複製程式碼

使用建構函式初始化值

我們現在的這個PersonIno類;
只能夠輸出一個人的資訊和年齡
如果我們需要輸出張三 李四  王五....
很多人的資訊怎麼辦??
這個時候我們就可以使用建構函式哈!
複製程式碼
void main() {
  //例項化
  var p = new PersonIno('李四', 20);
  p.info();
  
  // 類是可以被多次例項化的
  var p1 = new PersonIno('王五', 25);
  p1.info();
}

class PersonIno {
  // 類中的屬性
  String name;
  int age;

  // 建構函式的名稱和型別相同
  PersonIno(String name, int age) {
    this.name = name;
    this.age = age;
  }

  // 訪問類中的屬性
  info() {
    // 通過this的來訪問屬性
    print('我叫 ${this.name},今年${this.age}');
  }
}

複製程式碼

簡寫dart中的建構函式

  // 建構函式的簡寫方式
  PersonIno(this.name, this.age);

  // 與上面的相同
  PersonIno(String name, int age) {
  this.name = name;
  this.age = age;
}
複製程式碼

命名建構函式。

void main() {
  //例項化
  var p = new PersonIno('李四', 20);
}

class PersonIno {
  // 類中的屬性
  String name;
  int age;

  // 建構函式的簡寫方式
  PersonIno(this.name, this.age);
  PersonIno.myFun() {
    print('我是命名的建構函式');
  }
}

我們都知道在例項化的時候,會預設觸發【建構函式】。
但是並不會去觸發【命名建構函式】哈
如何去觸發【命名建構函式呢】
//這樣就會觸發預設的建構函式了
var p = new PersonIno.myFun();

一個類中只能有一個構造建構函式。
但是可以有多個建構函式
複製程式碼

命名建構函式也可以初始化值

void main() {
  //例項化
  var p = new PersonIno.myFun('餘聲聲', 22);
  p.info();
}

class PersonIno {
  // 類中的屬性
  String name;
  int age;

  // 建構函式的簡寫方式
  PersonIno(this.name, this.age);
  PersonIno.myFun(this.name, this.age);
  // 訪問類中的屬性
  info() {
    // 通過this的來訪問屬性
    print('我叫 ${this.name},今年${this.age}');
  }
}
複製程式碼

將類抽離出去

在實際的開發中,我們可能會有很多的類。
這樣會檔案越來越大。導致維護麻煩
這個時候,我們就需要將類抽離出去
那麼,如何將類抽離出去呢??
複製程式碼
在專案的根目錄下建立一個資料夾lib.
將類放入這個資料夾下哈
檔名【PersonIno】和類名【PersonIno】相同

import 'lib/PersonIno.dart';
void main() {
  //例項化
  var p = new PersonIno.myFun('餘聲聲', 22);
  p.info();
}
複製程式碼

私有的方法和屬性

dart和其他的物件導向的語言不一樣。
dart中沒有public private  protected這些訪問修飾符
但是我們可以使用_把一個屬性或者方法定義成為一個私有的。
需要注意的是:
如果你在屬性或者方法前面新增"_"在同一個檔案送仍然是可以訪問的【1】
但是如果是單獨抽離出去的檔案在屬性和方法前面新增“_"就不可以訪問【2】
複製程式碼

舉個例子【1】

void main() {
  var p = new PersonInfo('唐三', 18);
  print(p._age); //輸出18是可以訪問的
}

class PersonInfo {
  String name;
  int _age; //雖然新增了"_"表示私有,但是在同一個檔案中仍然可以訪問
  PersonInfo(this.name, this._age);
}
複製程式碼

例子【2】 lib目錄下的 PersonInfo 類檔案PersonInfo.dart

class PersonIno {
  // 類中的屬性
  String _name;
  int age;

  // 建構函式的簡寫方式
  PersonIno(this._name, this.age);
  // 訪問類中的屬性
  info() {
    // 通過this的來訪問屬性
    print('我叫 ${this._name},今年${this.age}');
  }
}
複製程式碼

這個時候就會出現訪問報錯

import 'lib/PersonIno.dart';
void main() {
  var p = new PersonIno('唐三', 18);
  print(p._name);
}

複製程式碼

求兩個數字的和

void main() {
  Sun c = new Sun(10, 20);
  print(c.backSum());
}

class Sun {
  num a;
  num b;
  Sun(this.a, this.b);
  backSum() {
    return this.a + this.b;
  }
}
複製程式碼

使用getter求兩個數字的和

void main() {
  Sun c = new Sun(10, 20);
  print(c.backSum); //直接訪問屬性的方式
}

class Sun {
  num a;
  num b;
  Sun(this.a, this.b);
  // 使用getter去掉小括號
  get backSum{
    return this.a + this.b;
  }
}
複製程式碼

setter方法的使用

void main() {
  Sun c = new Sun(10, 20);
  c.restateA = 100; //重新設定一個值
  print(c.backSum); //直接訪問屬性的方式 返回120
}

class Sun {
  num a;
  num b;
  Sun(this.a, this.b);
  // 使用getter去掉小括號
  get backSum {
    return this.a + this.b;
  }

  // setter的使用方法,
  set restateA(value) {
    this.a = value;
  }
}
複製程式碼

相關文章