추상 멤버의 구체적 구현이 유효하지 않아요
추상 멤버의 구체적 구현이 유효하지 않아요
추상 멤버의 구체적 구현이 올바르지 않을 때 Dart analyzer가 만들어 내는 진단이에요. 반환 타입, 메서드 파라미터 타입, 또는 타입 파라미터의 비호환성 때문에 발생할 수 있어요.
본문
이 진단은 다음 조건을 모두 만족할 때 발생해요.
- 클래스가 추상 멤버를 정의하고 있음
- 슈퍼클래스에 그 멤버의 구체적 구현이 존재함
- 그 구체적 구현이 추상 메서드의 유효한 구현이 아님
구체적 구현은 반환 타입, 메서드 파라미터의 타입, 또는 타입 파라미터가 호환되지 않아서 유효하지 않을 수 있어요.
아래 코드는 A.add 메서드의 파라미터 타입이 int 인데, 이를 오버라이드하는 B.add 메서드의 해당 파라미터 타입이 num 이라서 이 진단을 만들어 내요.
class A {
int add(int a) => a;
}
class B extends A {
int add(num a);
}
이게 왜 문제가 되는지 볼까요. B.add 를 다음과 같이 호출한다고 해보면요.
void f(B b) {
b.add(3.4);
}
B.add 는 가령 double 을 받을 수 있다고 기대하고 있어요. 그런데 실제로는 add 의 유일한 구체적 구현인 A.add 가 실행되면서, double 을 int 타입 파라미터에 할당할 수 없어서 런타임 예외가 발생해요.
고치는 방법
상황에 따라 여러 가지 방법으로 고칠 수 있어요.
서브클래스의 메서드가 슈퍼클래스의 구현에 맞출 수 있다면, 서브클래스의 선언을 바꿔 주세요. 같다면 그냥 지워 주면 되고요.
class A {
int add(int a) => a;
}
class B extends A {
int add(int a);
}
슈퍼클래스의 메서드를 일반화해서 서브클래스 메서드의 유효한 구현으로 만들 수 있다면, 슈퍼클래스 메서드를 바꿔 주세요.
class A {
int add(num a) => a.floor();
}
class B extends A {
int add(num a);
}
슈퍼클래스 메서드와 서브클래스 메서드 둘 다 고칠 수 없다면, 서브클래스에 그 메서드의 구체적 구현을 직접 제공해 주세요.
class A {
int add(int a) => a;
}
class B extends A {
int add(num a) => a.floor();
}
더 알아보기
- 메서드 오버라이딩 (method overriding)
- 추상 메서드