@ переопределение кода дротика
Я заметил, что 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 для доступа к абстрактному методу.