Dart:如何为抽象类创建最终成员接口

Tho*_*mas 5 inheritance interface dart

我想强制一个类User实现抽象类中的静态成员Base。这是可能的,还是我错误地使用了抽象继承范例?

如果没有继承,User可以简单地实现自己的静态成员而不覆盖Base,但我希望我的 linter 在类没有实现某些静态成员时抛出警告。

什么有效(不强制执行接口)

Base我们可以在和中隐式使用相同的接口User

abstract class Base {
  // This member could simply be removed and the snippet would still compile.
  static final String routeName = '/base';
}

class User extends Base {
  static final String routeName = '/base/user';
}
Run Code Online (Sandbox Code Playgroud)

如果我们要创建一个Person也扩展的新类Base,我们没有特定的实现要求。理想情况下,我想强制Person拥有一个静态成员routeName

class Person extends Base {
  // No warning about a missing static member 'routeName'.
}
Run Code Online (Sandbox Code Playgroud)

想法示例(无法编译)

Base包含未实现的静态成员 ( routeName)。

routeName除非我们指定(例如) ,否则该代码片段不会编译routeName = '/base'

abstract class Base {
  // IDE Error: The final variable 'routeName' must be initialized.
  static final String routeName;
}
Run Code Online (Sandbox Code Playgroud)

实现UserBase将覆盖或实现静态成员。

除非我们删除错误放置的@override.

class User extends Base {
  // IDE Warning: Field doesn't override an inherited getter or setter.
  @override
  static final String routeName = '/base/user';
}
Run Code Online (Sandbox Code Playgroud)

我希望 IDE 抛出该类的错误,Person因为它没有实现静态成员routeName

class Person extends Base {
  // Expected IDE Error: The static final variable 'routeName' must be initialized.
}
Run Code Online (Sandbox Code Playgroud)

对我来说,这看起来与Java 的做法类似,但我不熟悉 Java 的细节。

lrn*_*lrn 0

不,这是不可能的。静态成员不是继承的,它们不是任何接口的一部分,并且它们不是虚拟的,因此您不能“覆盖”。注释@override根本不适用于静态声明。

您可以在两个类上使用同名的静态 getter,但它们完全不相关,并且不必具有相同的类型甚至签名(一个可以是函数,另一个可以是 getter,完全不相关的声明)。每次访问其中之一都必须直接在源代码中选择哪一个。

(Java“继承”静态成员仅意味着您也可以在子类上调用它们,除非子类声明具有相同名称和签名的静态成员 - 因为 Java 具有重载 - 但您不会获得任何类型的虚拟覆盖或后期绑定。您仍然可以在编写调用时选择使用哪一个。您只是有更多方法来编写相同的内容。)