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/

반응형

+ Recent posts