我想强制使用类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';
}
如果我们要创建一个新的类Person
也扩展Base
,我们没有具体的实现要求。理想情况下,我想强制执行Person
有一个静态成员routeName
。
class Person extends Base {
// No warning about a missing static member 'routeName'.
}
想法示例(不编译(
Base
将包含一个未实现的静态成员 (routeName
(。
除非我们指定routeName
,否则此代码段不会编译(例如routeName = '/base'
(。
abstract class Base {
// IDE Error: The final variable 'routeName' must be initialized.
static final String routeName;
}
实现Base
的User
将重写或实现静态成员。
该代码段会报告警告,除非我们删除错误放置的@override
。
class User extends Base {
// IDE Warning: Field doesn't override an inherited getter or setter.
@override
static final String routeName = '/base/user';
}
我希望 IDE 为Person
类抛出错误,因为它没有实现静态成员routeName
。
class Person extends Base {
// Expected IDE Error: The static final variable 'routeName' must be initialized.
}
对我来说,这看起来类似于Java的做法,但我不熟悉Java的细节。
不,这是不可能的。静态成员不是继承的,它们不是任何接口的一部分,也不是虚拟的,所以你不能"覆盖"。@override
注释根本不适用于静态声明。
你可以在两个类上都有同名的静态 getter,但它们完全不相关,并且不必具有相同的类型甚至签名(一个可以是函数,另一个可以是 getter,完全不相关的声明(。每次访问其中一个都必须直接在源代码中选择哪一个。
(Java"继承"静态成员,只是在你可以调用它们在子类上的意义上,除非子类声明具有相同名称和签名的静态 - 因为Java有重载 - 但你没有得到任何类型的虚拟覆盖或后期绑定。您仍然可以在编写调用时选择使用哪一个。你只是有更多的方法来写同样的东西。