在Dart中,可以在抽象类中声明一个静态方法吗?

时间:2013-12-23 10:38:00

标签: class static dart abstract

abstract class中,我希望定义静态方法,但我遇到了问题。

在这个简单的例子中

abstract class Main {
  static String get name;
  bool use( Element el );
}

class Sub extends Main {
  static String get name => 'testme';
  bool use( Element el ) => (el is Element);
}

我收到错误:

  

方法'get:name'所需的函数体static String get name;

声明中是否有拼写错误,或者静态方法是否与抽象类不兼容?

2 个答案:

答案 0 :(得分:8)

Dart不会将静态方法继承到派生类。因此,创建抽象静态方法(没有实现)是没有意义的。

如果你想在课程Main中使用静态方法,你必须在那里完全定义它,并且总是像Main.name

那样调用它

==编辑==

我确信我读过或听过Gilad Bracha关于它的一些论点,但现在找不到它。

这种行为是恕我直言,主要是静态类型语言(我不知道很多动态语言)。静态方法类似于顶级函数,其中类名称仅用作命名空间。静态方法与实例化对象无关,因此继承不适用。在静态方法被“继承”的语言中,这只是语法糖。 Dart喜欢在这里更明确,并避免实例方法和静态方法之间的混淆(实际上它们不是方法而是函数,因为它们不作用于实例)。这不是我的主要领域,但希望无论如何都可能有所帮助; - )

答案 1 :(得分:1)

看起来你正试图“覆盖”静态方法。我不确定你想要在那里实现什么。我不知道任何OO语言支持(并且不确定它们如何)。

Java中的类似问题可能有助于澄清Polymorphism and Static Methods

另请注意,从Java(和其他OO语言)中的类实例引用静态被认为是不好的做法。有趣的是我注意到Dart不允许你这样做,所以实际上完全消除了这种不良做法。

所以你甚至无法自欺欺人地认为它会在Dart中表现多态,因为你无法从实例中调用静态。