dart系列之:dart类中的构造函数

简介: dart系列之:dart类中的构造函数

目录



简介


dart作为一种面向对象的语言,class是必不可少的。dart中所有的class,除了Null都继承自Object class。 要想使用dart中的类就要构造类的实例,在dart中,一个类的构造函数有两种方式,一起来看看吧。


传统的构造函数


和JAVA一样,dart中可以使用和class名称相同的函数作为其构造函数,这也是很多编程语言中首先的构造函数的创建方式,我们以Student类为例,来看看dart中的构造函数是怎么样的:


class Student {
  int age = 0;
  int id = 0;
  Point(int age, int id) {
    this.age = age;
    this.id = id;
  }
}


上面的this表示的是当前类的实例,对dart来说,this是可以忽略的,但是在上面的例子中,因为类变量的名字和构造函数传入参数的名字是一样的,所以需要加上this来进行区分。


上面的代码虽然很简单,但是写起来还是有太多的内容,下面是dart中的一种简写方式:


class Student {
  int age = 0;
  int id = 0;
  Student(this.age, this.id);
}


当然,你也可以不指定构造函数,这样的话dart会为你创建一个默认的无参的构造函数。


命名构造函数



dart和其他语言不同的地方是,还可以使用命名构造函数。命名构造函数的格式是ClassName.identifier,如下所示:


class Student {
  int age = 0;
  int id = 0;
  Student(this.age, this.id);
    Student.fromJson(Map data) {
    print('in Student');
  }
}


上面的Student.fromJson就是一个命名构造函数。可以使用该构造函数从Map中生成一个Student对象,有点像是java中的工厂方法。


构造函数的执行顺序


我们知道,dart中的类是可以继承的,那么对于dart中的子类来说,其构造函数的执行顺序是怎么样的呢?


如果不给dart类指定构造函数,那么dart会为类自动生成一个无参的构造函数,如果这个类是子类的话,则会自动调用父类的无参构造函数。


那么对应子类的构造函数来说,初始化的时候有三步:


  1. 调用初始化列表
  2. 调用父类的构造函数
  3. 调用自己的构造函数


在步骤2中,如果父类没有默认的无参构造函数,则需要手动指定具体父类的构造函数。怎么调用呢?可以直接在子类的构造函数后面使用:操作符接父类的构造函数,如下所示:


class Student {
  String? firstName;
  Student.fromJson(Map data) {
    print('in Student');
  }
}
class Jone extends Student {
  Jone.fromJson(Map data) : super.fromJson(data) {
    print('in Jone');
  }
}


理解了父类的构造函数之后,我们再看一下什么是初始化列表呢?


初始化列表就是在构造函数执行之前执行的代码,和调用父类的构造函数一样,也使用:操作符,如下所示:


Point.fromJson(Map<String, double> json)
    : x = json['x']!,
      y = json['y']! {
  print('In Point.fromJson(): ($x, $y)');
}


重定向构造函数


如果一个构造函数需要调用另外一个构造函数,而其本身并不进行任何变动,这可以使用重定向构造函数,重定向构造函数也使用:操作符,后面跟的是另外的构造函数:


class Point {
  double x, y;
  // 主构造函数
  Point(this.x, this.y);
  // 重定向构造函数
  Point.alongXAxis(double x) : this(x, 0);
}


Constant构造函数


如果对象中的属性在创建之后,是不会变化的,则可以使用Constant构造函数, 也就是在构造函数前面加上const修饰符,初始化的所有属性都要以final来修饰:


class ImmutablePoint {
  static const ImmutablePoint origin = ImmutablePoint(0, 0);
  final double x, y;
  const ImmutablePoint(this.x, this.y);
}


工厂构造函数


默认情况下,dart类中的构造函数返回的是该类的新实例,但是我们在实际的应用中可能会对返回的对象做些选择,比如从缓存中返回已经存在的对象,或者返回该类具体的实现子类。


为了实现这样的功能,dart中专门有一个Factory关键字,使用Factory的构造函数叫做工厂构造函数。


class Student {
  final String name;
  static final Map<String, Student> _studentMap =
  <String, Student>{};
  factory Student(String name) {
    return _studentMap.putIfAbsent(
        name, () => Student._newStudent(name));
  }
  factory Student.fromJson(Map<String, Object> json) {
    return Student(json['name'].toString());
  }
  Student._newStudent(this.name);
}


注意,dart中只能有一个未命名的构造函数,对应命名函数来说,名字不能够重复,否则会报The default constructor is already defined异常。


上面的代码中,factory Student是一个未命名构造函数,而factory Student.fromJson则是一个命名构造函数。


所以如果你再给Student加一个未命名构造函数,如下:


Student(this.name);


则会报错。


那么问题来了,factory构造函数和普通构造函数到底有什么区别呢?


他们最大的区别就是普通构造函数是没有返回值的,而factory构造函数需要一个返回值。


总结



以上就是dart中各种构造函数,和使用过程中需要注意的问题。

相关文章
|
缓存 前端开发 Java
13:SpringBoot跨域解决方案-Java Spring
13:SpringBoot跨域解决方案-Java Spring
473 0
|
算法 API 调度
深入探索:在std::thread中创建并管理QEventLoop的全面指南(一)
深入探索:在std::thread中创建并管理QEventLoop的全面指南
448 1
|
Java
java 文件上传 :MultipartFile 类型转换为file类型
java 文件上传 :MultipartFile 类型转换为file类型
421 9
|
SQL 消息中间件 Kafka
实时计算 Flink版产品使用问题之如何进行数据校验和订正
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的个人云盘管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的个人云盘管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
190 1
WXM
|
Java 应用服务中间件 网络安全
Eclipse运行SSM/SSH项目教程
Eclipse运行SSM/SSH项目教程
WXM
649 0
|
Web App开发 编解码 iOS开发
iOS字体像素与磅的对应关系
iOS字体像素与磅的对应关系
1285 1
|
网络协议 前端开发 测试技术
阿里云云效操作报错合集之Dockerfile流水线构建中,参数未获取到,是什么导致的
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
安全 网络协议 网络安全
2023 年度湖南省“楚怡杯“职业院校技能竞赛信息安全管理与评估赛项样题
2023 年度湖南省“楚怡杯“职业院校技能竞赛信息安全管理与评估赛项样题
|
供应链 API UED
Pandabuy VS Hagobuy 淘宝代购集运系统巨头,类似软件如何开发?
Pandabuy & Hoobuy是知名的淘宝代购集运平台,它们提供一站式购物物流服务。开发此类系统涉及市场定位、API接口集成、供应链管理、平台设计、支付物流整合及用户体验优化。例如,通过c0b.cc/R4rbK2可获取API测试,而成功的系统需确保用户友好性、多语言支持、国际支付与物流追踪,同时提供客服以保证高满意度。