一、概述
- 繼承(關(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();
}