面向对象扩展
继承,继承中的构造方法
抽象类
接口
Mixins,操作符的覆写
继承
- 使用关键字 extends继承一个类
- 子类会继承父类可见的属性和方法,不会继承构造方法
- 子类能够复写父类的方法、getter和setter
- 单继承、多态性
继承中的构造方法
- 子类的构造方法默认会调用父类的无名无参构造方法
- 如果父类没有无名无参构造方法,则需要显示调用父类构造方法
- 在构造方法参数后使用 : 显示调用父类构造方法
构造方法执行顺序
- 父类的构造方法在子类构造方法体开始执行的位置调用
- 如果有初始化列表,初始化列表会在父类构造防范之前执行(必须放在父类构造方法前面)
void main(){
var student = new Student("Tom","Male");
}
class Person{
String name;
//无名有参
Person(this.name);
//有名有参
Person.withName(this.name);
}
class Student extends Person{
int age;
//初始化列表
final String gender;
Student(String name,String g):gender = g,super.withName(name);
}
抽象类
- 抽象类使用abstract表示,不能直接被实例化
- 抽象方法不用abstract修饰,无实现
- 抽象类可以没有抽象方法
- 有抽象方法的类一定得声明为抽象类
abstract class Person{
//抽象方法
void run();
}
class Student extends Person{
@override
void run(){
print("run...");
}
}
接口
- 类和接口是统一的,类就是接口
- 每个类都隐式的定义了一个包含所有实例成员的接口
- 实现接口需要重写所有的属性和方法
class Person{
String name;
int get age=>18;
void run(){
print("Person run...");
}
}
class Student implements Person{
@override
String name;
@override
int get age=>null;
@override
void run(){
}
}
- 如果是复用已有类的实现,使用继承(extends)
- 如果只是使用已有类的外在行为,使用接口(implements)
- 所有的类都可以拿来作为接口使用,但是采用抽象类作为接口比较好
abstract class Person{
void run();
}
class Student implements Person{
@override
void run(){
print("Student run...");
}
}
Mixins
- Mixins类似于多继承,是在多继承中重用一个类代码的方式
- 作为Mixin的类不能有显示声明的构造方法
- 作为Mixin的类只能继承与Object
- with 连接Minxin的类
void main(){
var a = new A();
//会调用C的a()方法,与with 后类的顺序有关
a.a();
}
class A{
void a(){
print("a.a()...");
}
}
class B{
void a(){
print("b.a()...");
}
void b(){
}
}
class C{
void a(){
print("c.a()...");
}
void b(){
}
void c(){
}
}
class D extends A with B,C{
}
类本身是其他类组装而来的(组合的方式),可以简写为如下方式
abstract class Engine{
void work();
}
class OilEngine implements Engine{
@override
void work(){
print("Work with Oil...");
}
}
class ElectriEngine implements Engine{
@override
void work(){
print("Work with Electric...");
}
}
class Tyre{
String name;
void run(){}
}
//中文翻译为“混入”
class Car = Tyre with ElectriEngine;
class Bus = Tyre with OilEngine;
操作符覆写
- 覆写操作符需要在类中定义
返回类型 operator 操作符(参数1,参数2,…){
实现体…
return 返回值
}
- 如果覆写 == ,还需要覆写对象的hashCode getter方法
- 可覆写的操作符
< | + | | | [] |
---|---|---|---|
> | / | ^ | []= |
<= | ~/ | & | ~ |
>= | * | << | == |
- | % | >> |
简单的例子:
void main(){
var person1 = new Person(18);
var person2 = new Person(20);
print (person1['age']);
print(person1 > person2);
}
class Person{
int age;
Person (this.age);
//覆写>操作符
bool operator > (Person person){
return this.age > person.age;
}
//覆写[]操作符
int operator [](String str){
if("age" == str){
return age;
}
}
}
枚举
- 枚举是一种有穷序列集的数据类型
- 使用关键字enum定义一个枚举
- 常用于代替常量,控制语句等
Dart中的特性 - index从0开始,依次累加
- 不能指定原始值
- 不能添加方法
与其他语言的枚举相比,Dart中的枚举很简单,只有常量的功能
enum Season{
spring,
summer,
autumn,
winter
}
泛型
- Dart中类型是可选的,壳使用泛型限定类型
- 使用泛型能够有效的减少代码重复
- 类的泛型
- 方法的泛型
跟 Java 不同,Dart 的泛型参数类型在运行时是保留的。