Inheritance Dart-抽象构造函数

Inheritance Dart-抽象构造函数,inheritance,dart,Inheritance,Dart,假设我有抽象类A 抽象类A{ A.someConstructor(Foo-Foo); } 然后,A的所有子类都应该实现这样的构造函数: B类扩展了A类{ @凌驾 B.someConstructor(Foo-Foo){ // ... } } 所以基本上我想要的是某种抽象构造函数 有没有办法实现这一点(当然上面的代码不起作用)或者我需要一个普通的抽象方法来创建对象并设置其属性 编辑:好的,看来创建至少类似行为的唯一方法如下: 抽象类A{ A.someConstructor(对象foo); } B

假设我有抽象类A

抽象类A{
A.someConstructor(Foo-Foo);
}
然后,A的所有子类都应该实现这样的构造函数:

B类扩展了A类{
@凌驾
B.someConstructor(Foo-Foo){
// ...
}
}
所以基本上我想要的是某种抽象构造函数

有没有办法实现这一点(当然上面的代码不起作用)或者我需要一个普通的抽象方法来创建对象并设置其属性

编辑:好的,看来创建至少类似行为的唯一方法如下:

抽象类A{
A.someConstructor(对象foo);
}
B类扩展了A类{
B.someConstructor(objectfoo):super.someConstructor(foo){
// ...
}
}
这并不是很有用,在思考了我的问题之后,我意识到事实上我最初的目标本身并不是必要的,所以这个问题现在得到了回答

构造函数不是继承的

子类不从其超类继承构造函数。A. 声明没有构造函数的子类只有默认值(no 参数,无名称)构造函数

构造函数不是继承的

子类不从其超类继承构造函数。A. 声明没有构造函数的子类只有默认值(no 参数,无名称)构造函数


您希望在子类的构造函数上强制执行模式。Dart语言不支持这样做

Dart具有可用于限制值和类实例成员的类型和接口

如果类实现了接口,则其实例成员必须满足超级接口声明的签名。这将限制实例成员

如果变量具有类型,例如函数类型,则只能为其指定该类型的值。这会限制值。因为类是其接口的子类型,所以子类限制意味着可以安全地使用类类型变量(子类型可以用作其超类型,因为它具有兼容的接口)

没有办法限制类的静态成员、构造函数或库的成员,因为没有办法对它们进行抽象。您总是需要直接使用它们的精确名称来引用它们,因此它们不需要匹配特定的模式。 (这也许可以解释为什么你觉得这个目标没有必要)

在这种情况下,您的子类必须调用
A.someConstructor
构造函数,但它们可以自由选择自己的构造函数的签名。他们可以做到:

class B extends A {
  B.someConstructor(Object foo) : super.someConstructor(foo);
}
// or
class C extends A {
  C.differentName(Object foo) : super.someConstructor(foo);
}
// or even
class D extends A {
  D() : super.someConstructor(new Object());
}

您希望在子类的构造函数上强制执行模式。Dart语言不支持这样做

Dart具有可用于限制值和类实例成员的类型和接口

如果类实现了接口,则其实例成员必须满足超级接口声明的签名。这将限制实例成员

如果变量具有类型,例如函数类型,则只能为其指定该类型的值。这会限制值。因为类是其接口的子类型,所以子类限制意味着可以安全地使用类类型变量(子类型可以用作其超类型,因为它具有兼容的接口)

没有办法限制类的静态成员、构造函数或库的成员,因为没有办法对它们进行抽象。您总是需要直接使用它们的精确名称来引用它们,因此它们不需要匹配特定的模式。 (这也许可以解释为什么你觉得这个目标没有必要)

在这种情况下,您的子类必须调用
A.someConstructor
构造函数,但它们可以自由选择自己的构造函数的签名。他们可以做到:

class B extends A {
  B.someConstructor(Object foo) : super.someConstructor(foo);
}
// or
class C extends A {
  C.differentName(Object foo) : super.someConstructor(foo);
}
// or even
class D extends A {
  D() : super.someConstructor(new Object());
}

我不想继承构造函数,但要声明一个抽象的构造函数,所有子类都必须自己实现它,然后应该使用
implements
而不是
extends
。我不想继承一个构造函数,但要声明一个抽象的构造函数,所有子类都必须自己实现它。因此,您应该使用
implements
而不是
extends
。但这对构造函数仍然不起作用。