類的定義
在Dart中定義一個(gè)類的方法如下
class Person extends Object{
String name;
num age;
String sex = '男'; // 屬性
Person(this.name,this.age,this.sex); //構(gòu)造方法
List a = List();
// 打印個(gè)人信息(對(duì)象方法)
void printPersonInfo(){
print("名字=$name 年齡=$age 性別=$sex");
}
}
main() {
Person p = new Person('小明', 20, '男');
p.printPersonInfo();
}
// 打印結(jié)果
名字=小明 年齡=20 性別=男
Dart類的三種繼承方式
- 父類繼承 extends
- 實(shí)現(xiàn)接口 implements
- 多繼承 mixins
直接繼承 extends
- 直接繼承和其它語(yǔ)言的子類繼承于父類沒(méi)有區(qū)別
- 子類具有父親所有公開的屬性和方法
- 需要實(shí)現(xiàn)構(gòu)造方法
class XiaoMing extends Person {
XiaoMing(String name, num age, String sex) : super(name, age, sex);
}
main() {
XiaoMing p = new Person('小明', 20, '男');
p.printPersonInfo();
}
抽象類(implements)
- 抽象類的功能主要是定義標(biāo)準(zhǔn),在dart中采有abstract關(guān)鍵字定義抽象類;
abstract class Person{
String name;
num age;
String sex = '男'; // 屬性
// 實(shí)現(xiàn)方法體的方法,不是抽象方法
void printPersonInfo(){
print("名字=$name 年齡=$age 性別=$sex");
}
// 這是一個(gè)沒(méi)有實(shí)現(xiàn)方法體的方法,在Dart中叫抽象方法,
void drink();
}
- 抽象類不能實(shí)例化
// 此時(shí)Person類為抽象類,像下面的實(shí)例化會(huì)編譯器會(huì)報(bào)錯(cuò)
Person p = new Person('小明', 20, '男');
- 繼承于抽象類的子類必須實(shí)現(xiàn)抽象類的沒(méi)有方法體的方法(抽象方法);
- Dart中的抽象類中沒(méi)有方法體的方法我們稱之為抽象方法;
class PersonA implements Person,Animal {
}
接口
在dart中沒(méi)有專門定義接口的方法,定義接口和定義抽象類一樣
多繼承(mixins 混入)
- 作為mixins類只能繼承于Object,不能繼承于其它類;如果類繼承于非Object類,with該類會(huì)報(bào)錯(cuò),也就不能稱之為mixins類;
- 作為mixins的類不能有構(gòu)造函數(shù)
- 一個(gè)類可以with 多個(gè) mixins類
- with關(guān)鍵字繼承的類可以是抽象類,也可以是普通類,但這些類都只能繼承于Object
思考題
extends、with、implement 的區(qū)別
1.1. extends只能繼承于一個(gè)類;這個(gè)類可以是抽象類,也可以是普通類(對(duì)不對(duì))
1.2. implement用于實(shí)現(xiàn)接口,接口在dart中使用抽象類表示,implements一般用于實(shí)現(xiàn)抽象類的屬性和方法
1.3. with關(guān)鍵字只能繼承于父類為Object的類
1.4.使用extends可不可以繼承抽象類;
類A,with C類和D類,C類和D類中都有一個(gè)方法 printInfo,執(zhí)行A類的printInfo,會(huì)執(zhí)行那個(gè)類的;
答案:會(huì)執(zhí)行with類的順序,with順序在后面的方法會(huì)將前面的方法替換掉
此處應(yīng)該有例子類A,繼承于類Person, 并with于 C類和D類,person類、C類和D類中都有一個(gè)方法 printInfo,執(zhí)行A類的printInfo,會(huì)執(zhí)行那個(gè)類的;
答案:會(huì)執(zhí)行with類的順序,with順序在后面的方法會(huì)將前面的方法替換掉
此處應(yīng)該有例子mixins與真正的多繼承有什么區(qū)別
5.1. mixins只能繼承于父類為Object 的類
5.2 mixins 可以用with關(guān)鍵繼承抽象類,也必須實(shí)現(xiàn)抽象類中抽像方法對(duì)象使用with、implements、extends 繼承后,該對(duì)象的類型都是什么?
答案: 見代碼
abstract class A {
void printInfo(){
print('我是ClassA');
}
}
abstract class B {
void test();
}
class C{
}
class D<T> extends B with A implements C{
}
main(List<String> args) {
D d = new D();
// 三種粥承方式的類型
print(d is D);
print(d is A);
print(d is B);
print(d is C);
// 打印結(jié)果
true
true
true
true
}
- 抽像類能不能繼承于抽像類?
答案:可以,但是繼承了抽象類的抽象類不能再作為mixins類