在Dart中,你可以从构造函数中调用另一个构造函数

时间:2013-11-16 05:50:14

标签: constructor dart

也就是说,我试图从另一个构造函数中调用一个构造函数,然后进一步构造。如果可以的话,我无法从文档中找到答案。

这是一个人为的例子,如果有帮助的话:

class Chipmunk {

  Chipmunk.named(this.name);

  Chipmunk.famous() {
    this.named('Chip');  // <-- What, if anything, goes here?
    this.fame = 1000;   
  }
}

var chip = new Chimpmunk.famous();

2 个答案:

答案 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作为可选参数的原因。在这种情况下,您可以namefame最终。

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();