Section 39.11: 생성자에서 가상 메소드 호출하기
C++ 과 다르게, C# 에서는 클래스의 생성자에서 가상 메소드를 호출할 수 있다 (물론, C++ 에서도 호출 자체는 가능하지만 그 동작이 처음보는 사람에게는 조금 놀라울 수 있다). 예를 들어:
abstract class Base {
protected Base() {
_obj = CreateAnother();
}
protected virtual AnotherBase CreateAnother() {
return new AnotherBase();
}
private readonly AnotherBase _obj;
}
sealed class Derived: Base {
public Derived() {}
protected override AnotherBase CreateAnother() {
return new AnotherDerived();
}
}
var test = new Derived();
// test._obj 는 AnotherDerived 타입이다
기반 (base) 클래스의 생성자에서 이미 파생 클래스의 가상 메소드 테이블에 접근이 가능하다는 점이 C++ 에서 넘어온 사람들에게는 매우 놀라운 일일 수 있다.
유의할 점: 파생 클래스는 해당 시점에 아직 완전히 초기화가 이루어진 상태가 아닐 수 있다. (파생 클래스의 생성자는 기반 클래스의 생성자 다음으로 실행된다) 따라서 이러한 방식의 사용은 위험하다고 할 수있다 (StyleCop 에서는 이에 대한 경고도 포함하고 있다). 일반적으로 이는 바람직하지 않은 사용 예 (bad practice) 로 간주된다.
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.
[출처] https://books.goalkicker.com/CSharpBook/
반응형
'번역 > C# Notes for Professionals' 카테고리의 다른 글
40.2: public 액세스 한정자 (0) | 2022.04.06 |
---|---|
40.1: 다이어그램으로 표현된 각 액세스 한정자 (access modifier) 들 (0) | 2022.03.29 |
39.10: Generic 타입의 Static 생성자 (0) | 2022.03.24 |
39.9: 생성자와 속성값 초기화 순서 (0) | 2022.03.24 |
39.8: Static 생성자에서의 예외 발생시의 동작 (0) | 2022.03.23 |