【发布时间】:2020-09-21 00:25:00
【问题描述】:
在 Java 中,可以在类中声明方法以防止子类覆盖它。
例如:
class Foo {
final void bar() {
// some code here.
}
}
Dart 中有类似的构造吗?
【问题讨论】:
在 Java 中,可以在类中声明方法以防止子类覆盖它。
例如:
class Foo {
final void bar() {
// some code here.
}
}
Dart 中有类似的构造吗?
【问题讨论】:
package:meta 提供 @nonVirtual annotation 以禁止覆盖方法,并提供 @sealed annotation 以完全禁止派生类。
请注意,这些注释只是为dartanalyzer 提供提示。它们实际上不会阻止任何违反注释的内容,而是会在执行分析时导致打印警告。
【讨论】:
analysis_options.yaml 中声明invalid_override_of_non_virtual_member: error,所以这是一个分析错误,而不是警告。其次,如果分析发出错误,您可以构建构建脚本和/或 CI/CD 管道以使其失败。它非常实用,将防止违反这些注释。
是的,Irn & Jamesdlin 的代码回答:
import 'package:meta/meta.dart';
class Foo {
@nonVirtual
void bar() {
print("bar from Foo!");
}
}
class SubFoo extends Foo {
@override
void bar() {
print("bar from SubFoo");
}
}
您会从 Analyzer 收到如下警告:
成员 'bar' 在 'Foo' 中被声明为非虚拟并且不能在 subclasses.dart(invalid_override_of_non_virtual_member) 中被覆盖
【讨论】: