携手创作,共同成长!这是我参与「日新计划 8 月更文挑战」的第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. 调用自己的结构函数

往期精彩引荐

  • Flutter 开发呈现的那些 Bugs 和解决方案「继续更新… 」
  • Dart 知识点 – 数据类型

假如读者觉得文章还能够,不防一键三连:重视➕点赞➕收藏