让我们说我有具体的类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
的命名构造函数。类fromId
上的T
将采用身份字符串并返回Future<T>
。
答案 0 :(得分:2)
构造函数无法保证。
实例方法的接口(实现)保证。 超类(extends)或Mixins(with)也保证实例方法,而不是构造函数。
构造函数返回它自己的类型,而不是Future。
所以他们都应该有静态的方法或类,但不能保证。
答案 1 :(得分:0)
简短的答案是,您不能强制子类实现特定的命名构造函数...您所能做的就是强制子类确保命名构造函数被子类调用。
例如以下...
class Animal {
String name;
Animal.fromName(this.name);
}
class Dog extends Animal {
Dog.withName(String name) : super.fromName(name);
}
请注意以下...
Animal
没有零参数构造函数。super.fromName()
调用Dog
构造函数,则会出现编译错误The superclass 'Animal' doesn't have a zero argument constructor.
Dog
必须调用fromName()
构造函数...它不必相同地调用其命名的构造函数。在这种情况下,请注意它称为withName()
。