Dart 类的几个要点

一、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;
  }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值