@ переопределение кода дротика

Я заметил, что PetitParserDart имеет много @override в коде, но я не знаю, как они проверяются?

Я попробовал IDEA dart-plugin для @override, но это никак не влияет. Как мы можем использовать @override с дартсом?

3 ответа

Решение

@override аннотация является примером метаданных. Вы можете использовать зеркала, чтобы проверить их в коде. Вот простой пример, который проверяет, m1() Метод в дочернем классе имеет @verride аннотация:

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

От @override док:

Аннотация, используемая для пометки члена экземпляра (метода, поля, метода получения или установки) как переопределяющего наследуемый элемент класса. Инструменты могут использовать эту аннотацию для предупреждения, если нет переопределенного члена.

Таким образом, это зависит от инструмента, который вы используете.

В текущем редакторе дротиков (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()
}

это 2021 год. переопределение это необязательно. Используйте аннотацию @override разумно и только для методов, в которых суперкласс не находится под контролем программиста, суперкласс находится в другой библиотеке или пакете и не считается стабильным. В любом случае использование @override необязательно. из dart 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 для доступа к абстрактному методу.

Другие вопросы по тегам