@reopen 애너테이션 진단: 슈퍼타입이 의도적으로 막아둔 능력을 여는 클래스에만 붙일 수 있어요
@reopen 애너테이션 진단: 슈퍼타입이 의도적으로 막아둔 능력을 여는 클래스에만 붙일 수 있어요
@reopen 애너테이션은 슈퍼클래스가 의도적으로 제한한 능력을 여는 클래스에만 적용할 수 있어요. 슈퍼클래스의 제한을 실제로 풀지 않는 클래스나 mixin에 붙이면 Dart 분석기가 invalid_reopen_annotation 진단을 내보내요.
본문
설명
분석기는 @reopen 애너테이션이 슈퍼클래스에 부과된 제한을 제거하지 않는 클래스나 mixin에 붙어 있을 때 이 진단을 만들어요. 쉽게 말해, @reopen은 무언가 '다시 열어 주는' 역할을 할 때 의미가 있는데 그렇지 않은 데 써서 문제가 되는 거예요.
예시
다음 코드는 클래스 B가 A를 서브클래스화할 수 있게 펼치지(reopen) 않는데도 @reopen으로 애너테이션되어 있기 때문에 이 진단을 만들어요.
import 'package:meta/meta.dart';
sealed class A {}
@reopen
class B extends A {}
흔한 해결 방법
슈퍼클래스가 서브클래스가 바꿀 수 있는 방식으로 제한되어야 한다면, 슈퍼클래스를 그 제한을 반영하도록 수정해 주세요.
import 'package:meta/meta.dart';
interface class A {}
@reopen
class B extends A {}
슈퍼클래스가 올바르다면 애너테이션을 제거해 주세요.
sealed class A {}
class B extends A {}