Dart - 抽象构造函数

2024-06-19

假设我有抽象类 A

abstract class A {
  A.someConstructor(Foo foo);
}

A 的所有子类都应该实现这样的构造函数:

class B extends A {
  @override
  B.someConstructor(Foo foo) {
    // ...
  }
}

所以基本上我想要的是某种抽象构造函数。

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

编辑:好的,看起来创建至少类似行为的唯一方法是这样的:

abstract class A {
  A.someConstructor(Object foo);
}

class B extends A {
  B.someConstructor(Object foo) : super.someConstructor(foo) {
    // ...
  }
}

这并不完全有用,在思考了我的问题之后,我意识到事实上我最初的目标本身并不是真正必要的,所以这个问题现在得到了解答。


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

飞镖有types and 接口它可用于限制值和类实例成员。

如果一个类实现了一个接口,那么它的instance成员必须满足超级接口声明的签名。这限制了实例成员。

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

无法限制类的静态成员或构造函数或库的成员,因为无法对它们进行抽象。您始终必须通过他们的确切名称直接引用他们,因此没有need让它们匹配特定的模式。 (这可以解释为什么你发现这个目标也没有必要)。

在这种情况下,你的子类must打电话给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());
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dart - 抽象构造函数 的相关文章