Dart和OC跟Swift一樣是面向?qū)ο笞兂傻恼Z言,所以也有 封裝,繼承和多態(tài)的概念, 在Dart里萬物皆對象, 并且所有對象都繼承與Object, 所有的對象都是類的實例,通常情況下 類是由 屬性和方法組成的
通過class關(guān)鍵字來創(chuàng)建類
class Person {
String name = '張三';
int age = 23;
void getInfo() {
// print("姓名:$name ----- 年齡:$age");
print('姓名:${this.name}----- 年齡:${this.age}');
// this關(guān)鍵字指向了當(dāng)前類的實例
}
}
默認構(gòu)造函數(shù)
如果想要在初始化的時候?qū)崿F(xiàn)一些功能 則需要使用構(gòu)造函數(shù)
// 這是默認構(gòu)造函數(shù)
Person() {
print('這是構(gòu)造函數(shù)里的內(nèi)容, 在類初始化的時候觸發(fā)');
}
我個人認為這個構(gòu)造函數(shù)和iOS當(dāng)中的初始化方法意義差不多, 也可以被重寫,并且可以添加參數(shù)
Person(String name, int age) {
this.name = name;
this.age = age;
print('初始化 姓名:${this.name}----- 年齡:${this.age}');
}
// 默認構(gòu)造函數(shù)的簡寫
Person(this.name, this.age){
print('初始化 姓名:${this.name}----- 年齡:${this.age}');
}
命名構(gòu)造函數(shù)
Person.me() {
print('我是一個命名構(gòu)造函數(shù)');
}
默認構(gòu)造函數(shù)有且只有一個, 但是命名構(gòu)造函數(shù)可以有很多個
類當(dāng)中的私有變量和私有方法
用 _ 來修飾 前提是必須要把類單獨抽離成一個文件, dart里面沒有什么關(guān)鍵字是用來修飾私有變量和私有方法的
可以通過公共方法來調(diào)用私有方法和私有變量
class Animal {
String _name = '猴子';//私有屬性
int age = 20;
// 可以通過訪問共有方法來間接獲取私有屬性
String getName () {
return this._name;
}
// 私有方法
void _run() {
print('這是一個私有方法');
}
// 通過公共方法調(diào)用私有方法
execRun () {
this._run();
}
Animal(this._name, this.age);
void getInfo () {
print('姓名:${this._name}----- 年齡:${this.age}');
}
}
靜態(tài)函數(shù)和靜態(tài)屬性
用static來修飾, 靜態(tài)成員可以通過類名直接調(diào)用
int age = 22;
static var height = 175; // 靜態(tài)屬性
static void getHeight() {// 靜態(tài)方法
print(height);
}
void getInfoTemp () {
print('${this.age}-----${height}');// 非靜態(tài)方法可以訪問靜態(tài)成員和非靜態(tài)成員
getHeight();// 非靜態(tài)方法 也可以訪問靜態(tài)方法
}
// 調(diào)用
// 可以直接通過類來調(diào)用靜態(tài)變量和靜態(tài)方法,而不是通過實例變量
print(Person.height);
Person.getHeight();
注意
靜態(tài)方法 只能訪問靜態(tài)成員 不能訪問非靜態(tài)屬性也不能訪問非靜態(tài)方法
調(diào)用靜態(tài)成員時不能使用this 因為this代表當(dāng)前類的實例
非靜態(tài)方法可以訪問靜態(tài)成員和非靜態(tài)成員(方法和屬性都可訪問)
繼承
用extends來繼承其他類
子類會繼承父類里面可見的屬性和方法 但是不會繼承構(gòu)造函數(shù)
子類能復(fù)寫父類的方法
如果父類的默認構(gòu)造函數(shù) 為有參數(shù)的構(gòu)造函數(shù) 則子類必須要寫自己的構(gòu)造函數(shù)
重寫父類方法 直接和父類重名就行了或者用 @override
@override 可以寫 也可以不寫 建議寫上
子類里調(diào)用父類的方法 用super
class Boy extends Person {
String sex;
// 如果父類的默認構(gòu)造函數(shù) 為有參數(shù)的構(gòu)造函數(shù) 則子類必須要寫自己的構(gòu)造函數(shù)
Boy(String name, int age, String sex) : super(name, age) {
// super 表示 把子類初始化時傳進來的參數(shù) 賦值給父類
this.sex = sex;
}
@override // @override 可以寫 也可以不寫 建議寫上
void getInfo() {
// TODO: implement getInfo
// super.getInfo();
print('復(fù)寫父類 ${this.name}-----${this.age}');
}
}
抽象類用abstract關(guān)鍵字
1: Dart抽象類主要用于定義標(biāo)準(zhǔn), 子類可以繼承抽象類,也可以實現(xiàn)抽象類接口
2: Dart中抽象方法不能用abstract來修飾, Dart中沒有方法體的方法稱為抽象方法
3: 如果子類繼承抽象類,那么必須要實現(xiàn)抽象類里的抽象方法
抽象類用途: 抽象類主要用于約束子類 比如子類Dog中必須實現(xiàn)eat和run這兩個方法 這個時候父類就要用abstract來修飾(定義標(biāo)準(zhǔn))
abstract class Animal {
eat(); // 抽象方法 因為沒有方法體
run();
printInfo() {// 普通方法 因為有方法體
print('我是抽象類里的一個普通方法');
}
}
class Dog extends Animal {
@override
eat() {
// TODO: implement eat
print('小狗在吃狗糧');
}
@override
run() {
// TODO: implement run
print('小狗在跑');
}
}
接口 用關(guān)鍵詞implements實現(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() {
// TODO: implement printB
return null;
}
}
Mixins
1: 作為Mixins的類只能繼承自O(shè)bject 不能繼承其他類(這里指的不是根類 如果A繼承自Person那么A不能被c混入)
2: 作為Mixins的類不能有構(gòu)造函數(shù)(A B不能有構(gòu)造函數(shù))
3: Mixins可以混入多個類
4: Mixinx不是繼承 不是接口 是新的特性
總結(jié)
abstract, implements以及Mixins這三個東西的異同點,如何取舍及用途,網(wǎng)上有很多文章,我就不長篇大論了, 這里我只是說下我個人的理解,如果不對請各位指正
1:這三個東西可以實現(xiàn)開發(fā)者多繼承的意圖
2:可以制定規(guī)則規(guī)范,用來約束子類或者引用他們的類
3:我個人認為,這三個東西還有個重要的用途-------解耦!