6

假设我有 Cat、Dog 和 Parrot 的具体类,以及以下接口:

class HasGuid {
  HasGuid.fromId(String id);
}

我的目标是保证 Cat、Dog 和 Parrot 都有一个fromId命名构造函数。因此,我可以拨打以下电话:

Cat.fromId("Whiskers") =returns> [A Future<Cat> object with id "Whiskers"]
Dog.fromId("Fido")     =returns> [A Future<Dog> object with id "Fido"]
Parrot.fromId("Polly") =returns> [A Future<Parrot> object with id "Poly"]

fromId正在通过网络拨打电话,因此我将其作为Future. 我基本上想要一个合同,规定任何混合/扩展/实现/无论该类的HasGuid类都将具有fromId. Where fromIdon classT将采用标识字符串并返回一个Future<T>.

4

2 回答 2

5

简短的回答是,您不能强制子类实现特定的命名构造函数……您所能做的就是强制子类确保子类调用命名构造函数。

举个例子,下面...

class Animal {
  String name;

  Animal.fromName(this.name);
}

class Dog extends Animal {

  Dog.withName(String name) : super.fromName(name);
}

注意以下...

  1. Animal没有零参数构造函数。
  2. 如果你不调用super.fromName()构造函数,Dog你会得到一个编译错误
The superclass 'Animal' doesn't have a zero argument constructor.
  1. 虽然Dog必须调用fromName()构造函数......它不必调用它的命名构造函数。在这种情况下,请注意它被称为withName().
于 2019-05-31T22:56:05.690 回答
3

无法保证构造函数。

实例方法的接口(实现)保证。Super class(extends) 或 Mixins(with) 也保证实例方法,而不是构造函数。

构造函数返回它自己的类型,而不是 Future。

所以他们应该都有一个静态方法或类,但不能保证。

于 2013-04-21T15:42:01.300 回答