5

我注意到PetitParserDart在代码中有很多@override,但我不知道如何检查它们?

我尝试了 IDEA dart-plugin for @override,但它根本没有效果。我们如何@override与 Dart 一起使用?

4

3 回答 3

6

来自@override文档:

用于将实例成员(方法、字段、getter 或 setter)标记为覆盖继承的类成员的注释。如果没有被覆盖的成员,工具可以使用此注释来提供警告。

因此,这取决于您使用的工具。

在当前的 Dart 编辑器(r24275)中,以下代码没有警告,但它应该(它看起来像一个错误)。

import 'package:meta/meta.dart';
class A {
  m1() {}
}
class B extends A {
  @override m1() {} // no warning because A has a m1()
  @override m2() {} // tools should display a warning because A has no m2()
}
于 2013-07-09T14:40:09.323 回答
6

@override注释是元数据的一个示例。您可以使用 Mirrors 在代码中检查这些内容。下面是一个简单的例子,检查m1()子类中的方法是否有@override注解:

import 'package:meta/meta.dart';
import 'dart:mirrors';

class A {
  m1() {}
}

class B extends A {
  @override m1() {}
}

void main() {
  ClassMirror classMirror = reflectClass(B);
  MethodMirror methodMirror = classMirror.methods[const Symbol('m1')];
  InstanceMirror instanceMirror = methodMirror.metadata.first;
  print(instanceMirror.reflectee);  // Instance of '_Override@0x2fa0dc31'
}
于 2013-07-09T15:05:01.640 回答
1

现在是 2021 年。覆盖它是可选 的 明智地使用@override 注释,并且仅用于超类不受程序员控制的方法,超类位于不同的库或包中,并且它不被认为是稳定的。在任何情况下,@override 的使用都是可选的。来自飞镖 api https://api.dart.dev/stable/2.10.5/dart-core/override-constant.html

例子

 Class A {
 void say (){
 print ('Say something 1') ; 
}   
    

}

Class B extends A {
@override 
void adds() { // when i don't type the same name of super class function show  an   
              // warning not an error say 'The method doesn't override an inherited 
             //  method.' because it's  not same name but when type the same name must be 
             // overriding
print ('Say something 2 ')           



}

更新:@override 的主要用途是尝试在继承到抽象超类的子类中的抽象类中访问抽象方法。必须使用@override 来访问抽象方法。

于 2021-03-23T11:10:16.847 回答