也就是说,我试图从另一个构造函数中调用一个构造函数,然后进一步构造。如果可以的话,我无法从文档中找到答案。
这是一个人为的例子,如果有帮助的话:
class Chipmunk {
Chipmunk.named(this.name);
Chipmunk.famous() {
this.named('Chip'); // <-- What, if anything, goes here?
this.fame = 1000;
}
}
var chip = new Chimpmunk.famous();
答案 0 :(得分:20)
有两种方法可以做到这一点:
class Chipmunk {
String name;
int fame;
Chipmunk.named(this.name, [this.fame]);
Chipmunk.famous1() : this.named('Chip', 1000);
factory Chipmunk.famous2() {
var result = new Chipmunk.named('Chip');
result.fame = 1000;
return result;
}
}
Chipmunk.famous1()
是一个重定向构造函数。您无法在此属性中分配属性,因此您调用的构造函数必须允许您要设置的所有属性。这就是我添加fame
作为可选参数的原因。在这种情况下,您可以name
和fame
最终。
Chipmunk.famous2()
是工厂构造函数,可以只创建所需的实例。在这种情况下,fame
可能不是最终的(显然,如果您在fame
构造函数中使用了named
参数,则可能是这样。)
第一个变体可能是您用例的首选变体。
这是语言规范中的文档:
生成构造函数由构造函数名称,构造函数参数列表以及重定向子句或初始化列表和可选主体组成。
https://www.dartlang.org/docs/spec/latest/dart-language-specification.html#h.flm5xvbwhs6u
答案 1 :(得分:1)
这里可以使用init模式:构造函数只调用类中定义的init函数
在某些情况下,它可以优于重定向构造函数,我现在可以想到两个:
- 如果要保存/恢复对象的状态(在这种情况下,只需编写一次恢复部分)
- 如果您正在汇集(回收)您的对象,并且需要在复活它们时“刷新”它们。
class Chipmunk {
Chipmunk.named(string newName) { nameInit(newName) };
Chipmunk.famous() {
famousInit();
}
nameInit(string newName) {
name = newName ;
}
famousInit() {
nameInit('Chip');
fame = 1000;
}
string name;
num fame;
}
var chip = new Chimpmunk.famous();