likes
comments
collection
share

Dart 知识点 - 构造方法

作者站长头像
站长
· 阅读数 7

上一篇文章Dart 知识点 - 面向对象基础中,我们已经初步了解了类的构造方法,本文,我们详细来学习一下构造函数

推荐使用线上编辑器 dartpad.cn 进行学习,测试~

构造函数是类中的特殊方法。Dart 中的每个类都有一个默认的构造方法,并且可以有一个以上的构造方法。

声明和使用构造方法

通过创建一个和类名一样的方法,来声明一个构造函数,在初始化对象的时候,自动调用。比如上文所举例:

void main() {
  var person = new Person('Jimmy', 100); 
  person.sayHi(); // Hello Jimmy.
}

class Person {
  String name = '';
  double height = 0.0;
  // 构造函数
  Person(this.name, this.height); // 初始化对象,默认调用构造方法
  
  sayHi() {
    print('Hello ' + this.name + '.');
  }
}

我们还可以通过 ClassName.identifier 方式来调用,比如:

void main() {
  var person = Person.fromJson({
    'name': 'Jimmy',
    'height': 100,
  });
  
  person.sayHi(); // Hello Jimmy.
  print(person.toJson()); // {name: Jimmy, height: 100}

\
}

class Person {
  String name = '';
  double height = 0.0;
  /*
   * ClassName.identifier 形式构造方法
   * */
  Person.fromJson(Map<String, dynamic> json) {
    name = json['name'];
    height = json['height'];
  }
  
  // 将当前对象转化成 Json 数据
  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = Map<String, dynamic>();
    data['name'] = this.name;
    data['height'] = this.height;
    return data;
  }
  
  sayHi() {
    print('Hello ' + this.name + '.');
  }
}

命名构造方法

Dart 中不支持构造方法的重载,但是我们可以使用命名构造方法实现多个构造方法让代码更加清晰。命名构造方法格式:类名.方法名,比如下面👇

void main() {
  // 调用 Person 类的构造方法
  var person = Person.init(); // 命名构造方法
}

class Person {
  String name = '';
  double height = 0.0;
  Person(this.name, this.height);
  Person.init() {
    print('命名构造方法');
  }
}

构造方法不被子类继承,如果希望使用父类的中的命名构造方法创建子类,那么要在子类中实现该构造方法。

void main() {
  // 调用 Person 类的构造方法
  var person = Person.init(); // 命名构造方法
  var student = Student.init(); // 命名构造方法
}

class Person {
  String name = '';
  double height = 0.0;
  Person(this.name, this.height);
  Person.init() {
    print('命名构造方法');
  }
}

class Student extends Person {
  Student.init():super.init();
}

常量构造方法

如果类生成的对象不可以改变,那就需要常量构造方法。其所有的实例变量都是 final 的。如下:

void main() {
  var person = ImmutablePerson.instance;
  print(person.name); // Jimmy
}
class ImmutablePerson{
  static final ImmutablePerson instance = const ImmutablePerson('Jimmy');
  final String name = 'Jimmy';
  // 构造方法
  const ImmutablePerson(name);
}

工厂构造方法

构造方法就是单例模式,缓存之前创建的实例。工厂构造方法需要构造方法之前添加 factory 关键字。

class Student {
  static Student student;
  
  // 工厂构造方法
  factory Student() {
    if(student == null) {
      student = Student.init();
    }
    // 已经创建
    return instance
  }
  
  Student.init();
}

题外:Getters 和 Setters

get()set() 方法是专门用于读取和写入对象的属性的方法。

getset 是隐式存在

void main() {
  var person = Person('Tom', 0.0);
  print(person.name); // Jimmy
  print(person.height); // 100
}
class Person {
  
  double get height => 100.0;
  
  String get name => 'Jimmy';
  
  Person(name, height);
}

构造函数的执行顺序

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

往期精彩推荐

如果读者觉得文章还可以,不防一键三连:关注➕点赞➕收藏