【问题标题】:Is it possible to declare a method as final in a class in Dart?是否可以在 Dart 的类中将方法声明为 final?
【发布时间】:2020-09-21 00:25:00
【问题描述】:

在 Java 中,可以在类中声明方法以防止子类覆盖它。

例如:

class Foo {

   final void bar() {
     // some code here.
   }

}

Dart 中有类似的构造吗?

【问题讨论】:

    标签: class dart methods final


    【解决方案1】:

    package:meta 提供 @nonVirtual annotation 以禁止覆盖方法,并提供 @sealed annotation 以完全禁止派生类。

    请注意,这些注释只是为dartanalyzer 提供提示。它们实际上不会阻止任何违反注释的内容,而是会在执行分析时导致打印警告。

    【讨论】:

    • 谢谢。原来我根本不需要注解。
    • 它们实际上不会阻止任何违反注释的东西(...) 这种说法有点误导。首先,您可以在analysis_options.yaml 中声明invalid_override_of_non_virtual_member: error,所以这是一个分析错误,而不是警告。其次,如果分析发出错误,您可以构建构建脚本和/或 CI/CD 管道以使其失败。它非常实用,防止违反这些注释。
    • 更不用说在 Intellij IDEA 的 Dart 分析面板中可以看到分析器警告/错误,因此开发人员很有可能在构建脚本和/或 CI/CD 管道失败之前发现它们。跨度>
    【解决方案2】:

    是的,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) 中被覆盖

    【讨论】:

    • 这是我在回答中写的(减去示例)。正如我在那里指出的,警告来自分析器,而不是编译器。
    • 谢谢,jamesdlin,我刚刚编辑了我的 anwser。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    • 2019-06-20
    • 1970-01-01
    • 2011-03-06
    • 2020-03-24
    • 2010-10-13
    • 1970-01-01
    相关资源
    最近更新 更多