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;
}
}
複製程式碼