在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;
声明中是否有拼写错误,或者静态方法是否与抽象类不兼容?
答案 0 :(得分:8)
Dart不会将静态方法继承到派生类。因此,创建抽象静态方法(没有实现)是没有意义的。
如果你想在课程Main
中使用静态方法,你必须在那里完全定义它,并且总是像Main.name
==编辑==
我确信我读过或听过Gilad Bracha关于它的一些论点,但现在找不到它。
这种行为是恕我直言,主要是静态类型语言(我不知道很多动态语言)。静态方法类似于顶级函数,其中类名称仅用作命名空间。静态方法与实例化对象无关,因此继承不适用。在静态方法被“继承”的语言中,这只是语法糖。 Dart喜欢在这里更明确,并避免实例方法和静态方法之间的混淆(实际上它们不是方法而是函数,因为它们不作用于实例)。这不是我的主要领域,但希望无论如何都可能有所帮助; - )
答案 1 :(得分:1)
看起来你正试图“覆盖”静态方法。我不确定你想要在那里实现什么。我不知道任何OO语言支持(并且不确定它们如何)。
Java中的类似问题可能有助于澄清Polymorphism and Static Methods
另请注意,从Java(和其他OO语言)中的类实例引用静态被认为是不好的做法。有趣的是我注意到Dart不允许你这样做,所以实际上完全消除了这种不良做法。
所以你甚至无法自欺欺人地认为它会在Dart中表现多态,因为你无法从实例中调用静态。