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)
实现User的Base将覆盖或实现静态成员。
除非我们删除错误放置的@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 的细节。
不,这是不可能的。静态成员不是继承的,它们不是任何接口的一部分,并且它们不是虚拟的,因此您不能“覆盖”。注释@override根本不适用于静态声明。
您可以在两个类上使用同名的静态 getter,但它们完全不相关,并且不必具有相同的类型甚至签名(一个可以是函数,另一个可以是 getter,完全不相关的声明)。每次访问其中之一都必须直接在源代码中选择哪一个。
(Java“继承”静态成员仅意味着您也可以在子类上调用它们,除非子类声明具有相同名称和签名的静态成员 - 因为 Java 具有重载 - 但您不会获得任何类型的虚拟覆盖或后期绑定。您仍然可以在编写调用时选择使用哪一个。您只是有更多方法来编写相同的内容。)
| 归档时间: |
|
| 查看次数: |
972 次 |
| 最近记录: |