携手创作,共同成长!这是我参与「日新计划 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()
办法是专门用于读取和写入目标的属性的办法。
get
和set
是隐式存在
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);
}
结构函数的执行顺序
- 调用初始化列表
- 调用父类的结构函数
- 调用自己的结构函数
往期精彩引荐
假如读者觉得文章还能够,不防一键三连:重视➕点赞➕收藏