4.3.2 분산과 접근 수정자의 효과
4.3.2 분산과 접근 수정자의 효과
오버라이딩은 분산(variance)의 규칙을 따릅니다. 즉 인자 타입은 반변(contravariance)(덜 특수한 타입)을 허용하고, 반환 타입은 공변(covariance)(더 특수한 타입)을 허용해요:
class Base {
public function new() {}
}
class Child extends Base {
private function method(obj:Child):Child {
return obj;
}
}
class ChildChild extends Child {
public override function method(obj:Base):ChildChild {
return null;
}
}
class Main {
static public function main() {}
}
직관적으로 이는 인자가 함수에 "쓰여지고" 반환 값이 함수에서 "읽혀지기" 때문입니다.
예제는 가시성(visibility)이 어떻게 바뀔 수 있는지도 보여줘요: 오버라이딩 필드는 오버라이드된 필드가 private여도 public일 수 있지만, 그 반대는 안 됩니다.
inline으로 선언된 필드는 오버라이드할 수 없어요. 이는 상충하는 개념 때문이에요: 인라이닝은 컴파일 타임에 호출을 함수 본문으로 교체하는 반면, 오버라이딩 필드는 반드시 런타임에 해석되어야 합니다.
본문
분산 규칙
오버라이딩에서 인자 타입은 반변(더 일반적으로), 반환 타입은 공변(더 특수하게) 허용돼요. 이는 인자는 함수에 "쓰여지고" 반환 값은 "읽혀지기" 때문이에요.
가시성
오버라이딩할 때 private 필드를 public으로는 넓힐 수 있지만, public을 private로 좁힐 수는 없어요.
inline과 오버라이드 불가
inline 필드는 오버라이드할 수 없어요. 인라이닝은 컴파일 타임에, 오버라이딩은 런타임에 해석되기 때문에 개념이 충돌합니다.