invalid_use_of_visible_for_overriding_member — 오버라이딩 전용 멤버를 다른 용도로 사용
invalid_use_of_visible_for_overriding_member — 오버라이딩 전용 멤버를 다른 용도로 사용
@visibleForOverriding로 표시된 인스턴스 멤버를, 오버라이딩 목적이 아닌 다른 이유로 선언된 라이브러리 밖에서 참조하면 나타나는 진단이에요. 이 어노테이션의 의미와 올바른 사용 범위를 살펴볼게요.
본문
분석기는 visibleForOverriding 어노테이션이 달린 인스턴스 멤버를, 선언된 라이브러리 밖에서 그 멤버를 오버라이딩하기 위한 목적이 아닌 다른 이유로 참조할 때 이 진단을 내보내요.
쉽게 말해, 이 멤버는 "서브클래스가 오버라이딩하는 용도로만 공개된" 멤버예요. 그래서 공개돼 있더라도 오버라이딩이 아닌 다른 방식으로 건드리면 안 되는 거죠.
예시
먼저 a.dart 파일에 아래 선언이 있다고 해볼게요.
import 'package:meta/meta.dart';
class A {
@visibleForOverriding
void a() {}
}
그런데 아래 코드처럼 메서드 a가 (오버라이딩이 아니라) 그냥 호출되면 진단이 나타나요. a가 public인 이유는 오버라이딩을 허용하기 위해서뿐인데, 호출은 그 목적과 무관하니까요.
import 'a.dart';
class B extends A {
void b() {
a();
}
}
여기서 B는 A를 상속하지만, b() 안에서 a()를 오버라이딩하지 않고 호출만 하고 있어요. 그래서 제약에 걸리는 거예요.
흔한 해결 방법
멤버를 잘못 사용한 부분을 제거하면 돼요. 즉, 오버라이딩이 아닌 호출이나 참조를 없애면 이 진단이 사라져요.
더 알아보기
visibleForOverriding어노테이션의 의미는package:meta문서를 참고하세요.- Dart의 메서드 오버라이딩 기본 개념은 Dart 언어 투어 — 오버라이딩 부분을 함께 보면 이해가 빨라져요.