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



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

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

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

我们可以隐式使用相同的接口BaseUser.

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;
}

实现BaseUser将重写或实现静态成员。

该代码段会报告警告,除非我们删除错误放置的@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有重载 - 但你没有得到任何类型的虚拟覆盖或后期绑定。您仍然可以在编写调用时选择使用哪一个。你只是有更多的方法来写同样的东西。

最新更新