Dart构造函数
- 默认构造函数
一个类没有声明构造函数,默认会有一个无参构造函数,声明了有参的构造函数或者命名的构造函数,则就没有默认的无参构造函数
- 如果父类拥有无参构造函数,子类的所有构造函数都默认继承这一个无参构造,除非手动指定继承其他构造函数
- 如果父类没有无参构造函数,有带参构造或者命名构造函数,那么子类的构造函数必须手动指定所继承的父类构造函数
- 命名构造函数不可继承,如果子类想要有和父类一样的命名构造函数,那就写个同名的
class Person {
int age;
String name;
Person(int age, String name) {
this.age = age;
this.name = name;
}
}
//语法糖
Person(this.age, this.name);
// 命名构造函数
Person.init() {
//没有歧义时 省略this
age = 0;
name = '';
}
class Son extends Person{
int sonAge;
String sonName;
// 因为父类没有默认构造函数 所以子类必须显示声明无参构造函数且必须继承父类
Son():super.init();
}
class Son extends Person {
String sonName;
Son(Map<String, dynamic> map)
: sonName = map["studentNum"],
super(map["age"], map["name"]) {
print(
"this is a Son-> sonName = ${this.sonName}, age = ${this
.age},name = ${this.name}");
}
}
// 在其他函数中调用 Son(map); sonName 会被赋值
- 如果你的类,创建的对象永远不会改变,你可以在编译期就创建这个常量实例,并且定义一个常量构造函数,并且确保所有的成员变量都是final的
class ImmutablePoint {
static final ImmutablePoint origin =
const ImmutablePoint(0, 0);
final num x, y;
const ImmutablePoint(this.x, this.y);
}
- 有时候可能有一种需求,并不需要每次都创建新的类实例,而是每一种情况,只需要一个实例
- factory修饰的构造函数的名称必须是该类的类名
class FactoryClass {
final String name;
static final Map<String, FactoryClass> _cache =
<String, FactoryClass>{};
factory FactoryClass(String name) {
if (_cache.containsKey(name)) {
return _cache[name];
} else {
final object = FactoryClass._internal(name);
_cache[name] = object;
return object;
}
}
FactoryClass._internal(this.name);
}