Dart入门(三)

面向对象扩展

继承,继承中的构造方法

抽象类

接口

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 的泛型参数类型在运行时是保留的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值