Dart 面向对象


类与对象 声明 创建 基本特性

构造方法及初始化列表

静态成员 对象操作符的使用

类与对象

  • 关键字class声明 类

  • 关键字new创建 对象 new可以省略

  • 所有对象 继承于Object类

属性与方法

  • 属性默认 生成getter和setter方法

  • final声明的属性只有getter方法

  • 属性和方法通过 . 访问

  • 方法不能被重载

void main(){//可以省略new//var person = new Person();var person = Person();//赋值和获取值person.name = "Tom";person.age = 20;print(person.name);print(person.address);person.work();}class Person{String name;int age;final String address;void work(){print("Name is $name,Age is $age,He is working...")}}

Dart 类及成员可见性

  • Dart 可见性以library(库)为单位

  • 默认情况下 每个Dart文件就是一个库

  • _表示库的私有性(类、属性、方法)

  • import导入库

Dart计算属性

自定义getter和setter方法

  • 计算属性的值是通过计算而来 本身不存储值

  • 计算属性赋值 通过计算转换到其他实例变量

void main(){var rect = new Rectangle()rect.height = 20;rect.width =10;print(rect.area);rect.area = 200;print(rect.width);}class Rectangle{
	num width,height;
	num get area{
	return width*height;
	}
	set area(value){//高度先写死
	width = value/20;
}}

Dart构造方法

  • 如没有自定义构造方法,则有默认构造方法

  • 如果存在自定义构造方法 则默认构造方法无效

  • 构造方法不能重载

class person{
	String name;
	int age;
	final String gender;//构造方法
	person(this.name,this.age,this.gender){
	//是可以打印出值的,说明语法糖的赋值操作是在构造方法执行之前
	//语法糖的方式可以对final属性赋值
	print(name);
}}

Dart命名构造方法

  • 命名构造方法 可实现多个构造方法(弥补构造方法不能重载)

  • 类名**.**方法的形式实现

void main(){
	var person = new Person("Jim",20,"Male");
	new Person.withName("Jone");}class person{
	String name;
	int age;
	final String gender;//构造方法
	person(this.name,this.age,this.gender);//命名构造方法
	Person.withName(String name){
	this.name = name;
}}

Dart常量构造方法

  • 如果类是不可变状态,可把对象定义为编译时常量

  • const声明构造方法,并且所有变量都为final

  • const声明对象 可以省略

void main(){
    var person =  Person("Jim",20,"Male");}class person{
    final String name;
    final int age;
    final String gender;   //构造方法
    const person(this.name,this.age,this.gender);
}

在对象所有属性只需赋值一次的情况下使用常量构造方法,常量在运行时效率也更高,因为在编译时期已经确定了

Dart工厂构造方法

  • 工厂构造方法类似于设计模式中的工厂模式

  • 在构造方法前添加关键字factory实现一个工厂构造方法

  • 在工厂构造方法中可返回对象

class Logger{final String name;static final Map<String ,Logger> _cache = <String ,Logger>{};factory Logger(String name){
	if(_cache.containsKey(name)){
		return _cache[name];
	}else{
		final logger = Logger._internal(name);
		_cache[name] =logger;
		return logger;}}Logger._internal(this.name);void log(String msg){
	print(msg);}}

Dart初始化列表

  • 初始化列表会在构造方法体执行之前执行

  • 使用逗号分隔初始化表达式

  • 初始化列表常用于设置final变量的值

void main(){
	var person =  Person("Jim",20,"Male");}class person{
	final String name;
	final int age;
	final String gender;
	////语法糖可以给final赋值
	person(this.name,this.age,this.gender);
	//初始化列表给final赋值
	Person.withMap(Map map):gender = map["gender"]{
	this.name = map["name"];
	this.age = map["age"];
	}
	//同样普通属性也可以用初始化列表方式,用逗号分隔
	Person.withMap(Map map):name = map["name"],age = map["age"] gender = map["gender"]{
	
	}
	}

Dart静态成员

  • 使用static关键字来实现类及别变量和函数

  • 静态成员不能访问非静态成员,非静态成员可以访问静态成员

  • 类中的常量需要使用static const 声明

  • 不能使用对象.方法访问静态方法,只能通过类名.方法名访问,与java相同

Dart对象操作符

  • 条件成员访问:?.

void main(){Person person;//对象为空?后面逻辑就不执行了,很方便的处理了空指针的问题person?.name;person?.work();}class person{
	String name;
	int age;
	void work(){
	print("working...");
	}}
  • 类型转换:as

void main(){var person;person = "";person =new Person();(person as Person).work();}123456
  • 是否制定类型:is ,is!

void main(){var person;person = "";person =new Person();
	if(person is Person){
	person.work();
	}}
  • 级联操作:. .

void main(){
  new Person()
	..name ="Tom"
	..age = "20"
	..work();}

赋值后返回对象然后可以继续赋值,和build模式是不是一样样的

Dart对象call方法

之前讲过方法可以作为对象来使用,在Dart中对象也可以作为方法来使用

  • 如果类实现了 call()方法,则该类的对象可以作为方法使用

void main(){
	var person = new Person();
	print(person("Test",30));}class Person{
	String name;
	int age;
	String call(String name,int age){
		return "Name is $name,Age is $age";
	}}
  • 类声明、对象创建、属性、方法、可见性、计算属性

  • 构造方法、命名构造方法、常量构造方法、工厂构造方法

  • 初始化列表、静态成员、操作符、call方法