C++에서는 일반적으로 상속을 막는 방법이 없었습니다.
MFC에서는 CString을 상속해서 확장하는 것을 권하지 않고 있습니다.(CString은 CStringT 템플릿을 사용하게 되어 있는데 소멸자가 virtual이 아닙니다.)
하지만 이것을 강제할 방법은 없었습니다.
다만 C++11 이후에 상속을 막을 수 있는 키워드가 추가 되었습니다.
다음 링크에서 확인이 가능합니다.
2014/12/21 - [Programming/C++11&14] - [C++11] final과 override
물론 생성자등을 private로 선언하거나 하면, 원하는 기능을 구현할 수는 있습니다.
하지만 C#에서는 좀 더 쉽게 상속을 막을 수 있는 장치가 마련되어 있습니다.
이렇게 무분별한 상속을 막기 위해서 C#에서는 sealed라는 키워드가 있습니다.
상속을 막는 방법은 간단합니다.
class 클래스명에서 맨 앞에 sealed를 붙여주기만 하면 됩니다.
다음과 같이 작성하면 간단하게 상속을 막을 수 있습니다.
sealed class Base
상속을 받아서 기능 확장을 한다거나 하는 것을 원천적으로 막을 수 있습니다.
다음 예제와 같이 사용하시면 됩니다.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication5 { sealed class Base { } /* class Derived : Base { } */ class Program { static void Main(string[] args) { } } }
Base 클래스가 sealed로 선언이 되었습니다.
그렇기 때문에 주석 부분을 풀게 되면 Derived가 Base를 상속받기 때문에 에러가 발생합니다.
주석을 해제하고 컴파일을 하면 다음과 같은 에러가 출력됩니다.
error CS0509: 'ConsoleApplication5.Derived': cannot derive from sealed type 'ConsoleApplication5.Base'
상속이 객체 지향의 중요한 개념이긴 하지만 불필요한 경우도 있습니다.
그런 상황에서 sealed 키워드를 사용해서 명시적으로 상속을 막을 수 있습니다.
'Programming > CSharp' 카테고리의 다른 글
String.Split으로 토큰 단위로 파싱하기 (0) | 2016.01.23 |
---|---|
C#의 Property(속성) (0) | 2014.12.26 |
C# 물음표 2개(??) 연산자 (0) | 2014.12.25 |
C#의 키워드(Keywords) (0) | 2014.12.25 |