一、new 可要可不要
Dart的第一个版本实例化对象需要new关键字,但在Dart 2之后就去掉了new关键字
main(List<String> args) {
// 调用类名构造函数
Point point1 = new Point(3,4); // 等价于 Point point1 = Point(3,4);
print(point1.x);
}
二、构造函数的几种方式
1、类名和自定义命名构造函数及函数简化
import 'dart:math';
class Point {
int y;
int x;
// 类名构造函数
// 下面类名构造函数,用新的语法糖,可简写为 Point(this.x, this.y);
Point(num x, num y) {
this.x = x;
this.y = y;
}
// 使用自定义命名构造函数可以为类提供多个构造函数,按官方的说法就是提供额外的清晰度
// 下面自定义命名构造函数,用新的语法糖,可简写为 Point.nihao(this.x, this.y);
Point.nihao(num x, num y){
this.x = x;
this.y = y;
}
}
void main(){
var point = Point(1,2);
print(point.x);
print(point.y);
var point2 = Point.nihao(3, 4);
print(point2.x);
print(point2.y);
}
2、重定向构造函数
重定向构造函数的主体为空,构造函数调用出现在冒号( :)之后。
即在创建类时,我定义一个命名构造函数,但是这个构造函式的主体我不实现,直接通过另外一个构造函数。实现对外界传入的参数接收并赋值给内部的变量。
class Point {
num x, y;
// 类名构造函数
Point(this.x, this.y);
// 命名构造函数
Point.order(this.x,this.y);
// 重定向构造函数, origin构造函数将外界的传值,指向给了order构造函数。
Point.origin(num a,num b):this.order(a,b);
}
void main(List<String> args){
var point = new Point.origin(1,2);
print(point.x);
print(point.y);
}
三、类的继承
1、调用父类自定义命名的构造函数
// Person类中没有一个无参数,未命名的构造函数
class Person {
String firstName;
// 命名构造函数
Person.fromJson(Map data) {
print('in Person');
}
}
class Employee extends Person {
// 若父类不显性展示该默认构造函数Person(){},则必须调用父类的super.fromJson(data).
Employee.fromJson(Map data) : super.fromJson(data) {
print('in Employee');
}
}
main() {
var emp = new Employee.fromJson({});
}
2、noSuchMethod()
当用户调用你定义的类中不存在的属性与方法时,可以做出一些响应,通过重写noSuchMethod()
class A {
@override
void noSuchMethod(Invocation invocation) {
print('You tried to use a non-existent member: ' + '${invocation.memberName}');
}
}
四、枚举类型
使用enum关键词来声明一个枚举类型
enum Color { red, green, blue }
枚举中的每个值都有一个index索引,它返回枚举声明中值的从零开始的位置。
例如,第一个值具有索引0,第二个值具有索引1。
assert(Color.red.index == 0);
assert(Color.green.index == 1);
assert(Color.blue.index == 2);
若要获取枚举中所有值的列表,请使用枚举的values常量。
List<Color> colors = Color.values;
assert(colors[2] == Color.blue);
五、泛型
泛型,即定义的一个类型,类型暂不确定,给使用给一个占位符给代替,在使用的时候可以给确定其定义的类型。
基本上强类型语言都支持泛型,比如java,Oc,swift 所以Dart也不例外
void main(List<String> args) {
DataHolder<String> dataHolder = new DataHolder('Old data');
print(dataHolder.getData());
dataHolder.setData('New Data');
print(dataHolder.getData());
}
class DataHolder<T> {
T data;
DataHolder(this.data);
getData() {
return data;
}
setData(data) {
this.data = data;
}
}