【问题标题】:Dart: how to create a Final member Interface for Abstract ClassDart:如何为抽象类创建最终成员接口
【发布时间】:2019-10-09 11:46:57
【问题描述】:

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

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

什么有效(不强制接口)

我们可以在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'.
}

idea 示例(不编译)

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

除非我们指定 routeName(例如 routeName = '/base'),否则此 sn-p 不会编译。

abstract class Base {
  // IDE Error: The final variable 'routeName' must be initialized.
  static final String routeName;
}

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

sn-p 报告警告,除非我们删除错误放置的@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.
}

在我看来,这类似于 how Java does it,但我不熟悉 Java 细节。

【问题讨论】:

  • 您愿意接受其他解决方案吗?这不可能如您所愿,但还有其他非常方便的方法可以实现。
  • 欢迎对静态成员强制执行这种类行为的任何其他解决方案。我的主要目标是捕获有异味或不完整的类(最好使用静态代码分析或 IDE 中的 linting)。
  • 期待完全相同的功能/解决方案/绕过
  • 我一直在使用 getter 来实现类似的东西。结果是一个易于实现的类,但 getter 仍然需要一个本地定义的常量来实现编译时间的方法。

标签: inheritance dart interface


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-05-18
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 2015-12-19
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多