类的定义
在Dart中定义一个类的方法如下
class Person extends Object{
String name;
num age;
String sex = '男'; // 属性
Person(this.name,this.age,this.sex); //构造方法
List a = List();
// 打印个人信息(对象方法)
void printPersonInfo(){
print("名字=$name 年龄=$age 性别=$sex");
}
}
main() {
Person p = new Person('小明', 20, '男');
p.printPersonInfo();
}
// 打印结果
名字=小明 年龄=20 性别=男
Dart类的三种继承方式
- 父类继承 extends
- 实现接口 implements
- 多继承 mixins
直接继承 extends
- 直接继承和其它语言的子类继承于父类没有区别
- 子类具有父亲所有公开的属性和方法
- 需要实现构造方法
class XiaoMing extends Person {
XiaoMing(String name, num age, String sex) : super(name, age, sex);
}
main() {
XiaoMing p = new Person('小明', 20, '男');
p.printPersonInfo();
}
抽象类(implements)
- 抽象类的功能主要是定义标准,在dart中采有abstract关键字定义抽象类;
abstract class Person{
String name;
num age;
String sex = '男'; // 属性
// 实现方法体的方法,不是抽象方法
void printPersonInfo(){
print("名字=$name 年龄=$age 性别=$sex");
}
// 这是一个没有实现方法体的方法,在Dart中叫抽象方法,
void drink();
}
- 抽象类不能实例化
// 此时Person类为抽象类,像下面的实例化会编译器会报错
Person p = new Person('小明', 20, '男');
- 继承于抽象类的子类必须实现抽象类的没有方法体的方法(抽象方法);
- Dart中的抽象类中没有方法体的方法我们称之为抽象方法;
class PersonA implements Person,Animal {
}
接口
在dart中没有专门定义接口的方法,定义接口和定义抽象类一样
多继承(mixins 混入)
- 作为mixins类只能继承于Object,不能继承于其它类;如果类继承于非Object类,with该类会报错,也就不能称之为mixins类;
- 作为mixins的类不能有构造函数
- 一个类可以with 多个 mixins类
- with关键字继承的类可以是抽象类,也可以是普通类,但这些类都只能继承于Object
思考题
extends、with、implement 的区别
1.1. extends只能继承于一个类;这个类可以是抽象类,也可以是普通类(对不对)
1.2. implement用于实现接口,接口在dart中使用抽象类表示,implements一般用于实现抽象类的属性和方法
1.3. with关键字只能继承于父类为Object的类
1.4.使用extends可不可以继承抽象类;
类A,with C类和D类,C类和D类中都有一个方法 printInfo,执行A类的printInfo,会执行那个类的;
答案:会执行with类的顺序,with顺序在后面的方法会将前面的方法替换掉
此处应该有例子类A,继承于类Person, 并with于 C类和D类,person类、C类和D类中都有一个方法 printInfo,执行A类的printInfo,会执行那个类的;
答案:会执行with类的顺序,with顺序在后面的方法会将前面的方法替换掉
此处应该有例子mixins与真正的多继承有什么区别
5.1. mixins只能继承于父类为Object 的类
5.2 mixins 可以用with关键继承抽象类,也必须实现抽象类中抽像方法对象使用with、implements、extends 继承后,该对象的类型都是什么?
答案: 见代码
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);
// 打印结果
true
true
true
true
}
- 抽像类能不能继承于抽像类?
答案:可以,但是继承了抽象类的抽象类不能再作为mixins类