Dart中的构造函数

这篇具有很好参考价值的文章主要介绍了Dart中的构造函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Dart中的构造函数有4种,分别是:

  • ClassName(...) //普通构造函数
  • Classname.identifier(...) //命名构造函数
  • const ClassName(...) //常量构造函数
  • factroy ClassName(...) //工厂构造函数

 普通构造函数

普通构造函数可以分为无参构造函数和有参构造函数。

如果不声明构造函数,则dart会提供一个默认的无参构造函数。当然,也可以自己定义有参构造函数,如果自己写了构造函数,那么默认构造函数就不存在了。

我们可以这么来定义一个有参构造函数

class People{
  int? age;
  String? name;
  People(int age, String name){
    this.age = age;
    this.name = name;
  }
}

这种赋值方式如果变量很多的话写起来比较麻烦,所以dart提供了语法糖来简化,直接在参数列表上这么写:

class People{
  int? age;
  String? name;
  People(this.age, this.name);
}

注意:

  • Dart 构造函数不允许重载,即不允许有相同名称的构造函数,否则编译器会报错

Dart中的构造函数

如果想设置不同的参数可通过可选参数列表来设置:

class People{
  int? age;
  String? name;
  People({this.age, this.name});
}

这种写法涵盖了这么几种形式:

People();
People(this.age);
People(this.name);
People(int age, String name);
  • 当子类继承父类时,初始化子类构造函数会优先初始化父类构造函数,继承时需要使用 super调用父类构造函数,若父类为无参构造函数时可以省略。
class Child extends People{
  Child(int age, String name): super(age: age, name: name);
  // Child(int age, String name); 若父类为无参构造函数时则可以省略super调用
}

命名构造函数

格式:类名.构造函数名

class People{
  int? age;
  String? name;

  People.fromMap(Map map){
    this.age = map["age"];
    this.name = map["name"];
  }
}

使用命名构造函数可为一个类实现多个构造函数,但是同样是不能重载。

如果一个里只有命名构造函数,那么子类需要显示调用父类的命名构造函数。

class B extends People{
  B(Map map) : super.fromJson(map);
}

否则会报错

Dart中的构造函数


初始化列表

除了调用父类的构造函数,你还可以在执行构造函数体及调用父类构造函数之前初始化实例变量,使用逗号分隔每个初始化变量。

class Employee extends People {
  int? no;
  String? job;
  String? address;
  int? age1;

  Employee(this.job, this.address, int? age)
      : this.no = 123456,
        age1 = age ?? 25,
        super(age: age);
}

调用的顺序如下:

  • 初始化列表
  • 父类的构造函数
  • 子类的构造函数

参数列表对于初始化那些final修饰的成员变量很有用,因为在方法体中,不能给final修饰的成员变量赋值,因为在执行方法体的时候,final修饰的成员变量已经不能变了。

Dart中的构造函数

注意:

  • 传递给父类构造函数的参数及初始化表达式的右边不能使用 this 关键字和访问实例成员变量,因为在参数传递的这一步骤,子类构造函数尚未执行,子类的实例对象也就还未初始化,因此所有的实例成员都不能被访问。Dart中的构造函数
  • 同一实例成员在参数列表和初始化列表中不能同时存在,

构造函数传递(重定向构造函数)

定义构造函数的时候,除了可以定义一个普通构造函数之外,还可以定义若干个命名构造函数,这些构造函数之间,有时候会有一些相同的逻辑,如果分别写在各个构造函数中,会显得有些多余,所以构造函数可以传递。传递构造函数是没有方法体的,可以在初始化列表中,调用另一个构造函数。

class Point {
  final num x;
  final num y;
  final num area;

  Point(x, y)
      : this.x = x,
        this.y = y,
        this.area = x * x + y * y;
  
  Point.alongXAxis(num x) : this(x, 0);
}

如果添加方法体,编译器会报错。Dart中的构造函数


常量构造函数

如果生成类的对象是不会变的,可以定义常量构造函数(如果你的类,创建的对象永远不会改变,你可以在编译期就创建这个常量实例,并且定义一个常量构造函数,并且确保所有的成员变量都是final的。)。

class Point {
  final num x;
  final num y;
  final num area;

  const Point(x, y)
      : this.x = x,
        this.y = y,
        this.area = x * x + y * y;
}

在使用时需注意:

  1. 常量构造函数必须用 const 关键词修饰;比如我们定义一个常量,给该常量赋的值必须也是常量。(使用const赋值声明,后面的const可省略)。Dart中的构造函数
  2. 所有实例变量必须是 final 类型的。Dart中的构造函数
  3. 常量构造函数不允许有函数体。Dart中的构造函数
  4. 实例化时需要加 const, 否则实例化的对象仍然可以修改变量值。Dart中的构造函数

工厂构造函数

有时候可能有一种需求,并不需要每次都创建新的类实例,而是每一种情况,只需要一个实例,这时候工厂构造函数就派上用场了。

工厂构造函数使用关键字factory来定义,factory可以放在类名函数之前,也可以放在命名函数之前。

使用场景:

  1. 避免创建过多的重复实例,如果已创建该实例,则从缓存中拿出来。
    class Logger {
      final String name;
      bool mute = false;
    
      // _cache 变量是库私有的,因为在其名字前面有下划线。
      static final Map<String, Logger> _cache =
      <String, Logger>{};
    
      factory Logger(String name) {
        return _cache.putIfAbsent(
            name, () => Logger._internal(name)); //工厂构造函数里可以调用其他构造函数。
      }
    
      factory Logger.fromJson(Map<String, Object> json) {
        return Logger(json['name'].toString());
      }
    
      Logger._internal(this.name);
    
      void log(String msg) {
        if (!mute) print(msg);
      }
    }
  2. 实现简单工厂模式,在java中抽象类是不能直接被实例化的,但是在dart中,使用工厂构造函数可以让抽象类被实例化。
    abstract class Animal {
      String? name;
      void getNoise();
      factory Animal(String type, String name) {
        switch (type) {
          case "cat":
            return new Cat(name);
          case "dog":
            return new Dog(name);
          default:
            throw "The '$type' is not an animal";
        }
      }
    }
    
    class Cat implements Animal {
      String? name;
      Cat(this.name);
    
      @override
      void getNoise() {
        print("${this.name}: 喵~");
      }
    }
    
    class Dog implements Animal {
      String? name;
      Dog(this.name);
    
      @override
      void getNoise() {
        print("${this.name}: 旺~");
      }
    }
    void main() {
      var cat = new Animal("cat", "花花");
      var dog = new Animal("dog", "小黑");
      cat.getNoise(); // 花花:  喵~
      dog.getNoise(); // 小黑: 旺~
    }
  3. 单例模式,可用于工具类。
    class Singleton {
      static final Singleton _singleton = Singleton._internal();
    
      factory Singleton() {
        return _singleton;
      }
    
      Singleton._internal();
    }
    void main() {
      var s1 = Singleton();
      var s2 = Singleton();
      print(identical(s1, s2)); // true
    }

注意:文章来源地址https://www.toymoban.com/news/detail-405877.html

  1. 工厂构造函数不能和其他构造函数一样,使用this关键字来调用class的属性和方法。工厂构造函数只能使用类中static类型的属性和方法。Dart中的构造函数
  2. 在其他类型的构造函数方法体里是不能有返回值,也就是不能出现return关键字,但是工厂函数是必须要有的,而且不能返回null。Dart中的构造函数Dart中的构造函数

到了这里,关于Dart中的构造函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】继承 ⑦ ( 继承中的对象模型分析 | 继承中的构造函数和析构函数 )

    下面有 3 个类 , 分别是 A 类 , B 类 , C 类 ; A 类是 基类 ; B 类 公有继承 A 类 , 并定义了新的 成员变量 y ; C 类 公有继承 B 类 , 并定义了新的 成员变量 z ; 分别定义上述 3 个类的对象 , 上述 3 个对象的内存模型如下 : A 类对象 objA 中有一个成员 int x , 在内存中只有一个 int 类型的

    2024年02月08日
    浏览(41)
  • 以太坊智能合约开发:Solidity语言中的构造函数

    Solidity语言中关于构造函数的定义: 构造函数是使用 constructor 声明的一个可选函数; 构造函数只在合约部署时调用一次,并用于初始化合约的状态变量; 如果没有显式定义的构造函数,则由编译器创建默认构造函数。 构造函数声明语法如下: 其中: ** constructor :

    2024年02月01日
    浏览(45)
  • java中构造函数在继承中的调用顺序是什么?

    在Java中,当创建子类对象时,构造函数的调用顺序遵循以下规则: 父类的静态变量和静态初始化块 :首先,Java会加载父类,并执行父类中的静态变量初始化和静态初始化块(静态代码块)。这只会在类首次被加载到JVM时执行一次。 子类的静态变量和静态初始化块 :接下来

    2024年04月10日
    浏览(31)
  • 【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用 )

    C++ 构造函数可以分为以下几类 : 无参构造函数 : 最简单也是默认的构造函数 , 函数没有参数 , 如果创建一个对象 , 没有传入参数 , 调用的就是该类型的 构造函数 ; 有参构造函数 : 带参数的 构造函数 , 创建 实例对象 时 , 为成员变量提供初始值 ; 拷贝构造函数 : 拷贝现有 实例

    2024年02月07日
    浏览(32)
  • C++委托构造函数和继承构造函数

    委托构造函数          C++11允许在一个构造函数的定义中使用另一个构造函数来简化编码工作。这被称为委托,因为构造函数暂时将创建对象的工作委托给另一个构造函数。 继承构造函数         为了进一步简化编码工作,C++11提供了一种让派生类能够继承基类构造函数的

    2024年02月13日
    浏览(35)
  • 【C++初阶】类和对象——构造函数&&析构函数&&拷贝构造函数

    ========================================================================= 个人主页点击直达: 小白不是程序媛 C++系列专栏: C++头疼记 ========================================================================= 目录 前言 类的6个默认成员函数 构造函数 概念 构造函数的特性 析构函数 概念 析构函数特性 拷贝构

    2024年02月06日
    浏览(41)
  • C++ 类和对象(二)构造函数、析构函数、拷贝构造函数

            本文将介绍类的6个默认成员函数中的构造函数、析构函数和拷贝构造函数,赋值重载和取地址重载涉及运算符重载的知识,将在下篇讲解。所谓默认成员函数,也就是每个类都有的成员函数,我们可以显式定义这些函数,否则,编译器会自动生成它们。 目录 前言

    2024年02月09日
    浏览(35)
  • ⚡【C++要笑着学】(7) 默认成员函数:构造函数 | 析构函数 | 拷贝构造函数

    🔥 订阅量破千的火热 C++ 教程 👉 火速订阅 《C++要笑着学》   🔥 CSDN 累计订阅量破千的火爆 C/C++ 教程的 2023 重制版,C 语言入门到实践的精品级趣味教程。 了解更多: 👉  \\\"不太正经\\\" 的专栏介绍  ← 试读第一章 订阅链接: 🔗 《C语言趣味教程》 ← 猛戳订阅!   本篇

    2024年02月07日
    浏览(55)
  • 【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用)

       🌈个人主页: 秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343 🔥 系列专栏:   目录 类的6个默认成员函数 构造函数 特性  析构函数 特性  析构的顺序 拷贝构造函数 特性 常引用      💬 hello! 各位铁子们大家好哇。              今日更新了类与对象的构造函数、

    2024年02月21日
    浏览(35)
  • C++:构造方法(函数);拷贝(复制)构造函数:浅拷贝、深拷贝;析构函数。

    1.构造方法(函数) 构造方法是一种特殊的成员方法,与其他成员方法不同: 构造方法的名字必须与类名相同; 无类型、可有参数、可重载 会自动生成,可自定义 一般形式:类名(形参); 例: Stu(int age); 当用户没自定义构造方法时,系统将会执行默认构造方法,当用户自定义一个

    2024年02月11日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包