sealed(C# 참조)
업데이트: 2007년 11월
클래스에 적용될 경우 sealed 한정자는 다른 클래스가 해당 클래스에서 상속하지 않도록 합니다. 다음 예제에서 B 클래스는 A 클래스에서 상속하지만 B 클래스에서 상속할 수 있는 클래스는 없습니다.
class A {}
sealed class B : A {}
기본 클래스의 가상 메서드나 속성을 재정의하는 메서드 또는 속성에 sealed 한정자를 사용할 수도 있습니다. 이렇게 하면 클래스에서 클래스를 파생시키고, 해당 클래스에서 특정 가상 메서드나 속성을 재정의하지 못하도록 할 수 있습니다.
예제
다음 예제에서 C는 B에서 상속하지만 C는 A에 선언되고 B에 봉인된 가상 함수 F를 재정의할 수 없습니다.
class X
{
protected virtual void F() { Console.WriteLine("X.F"); }
protected virtual void F2() { Console.WriteLine("X.F2"); }
}
class Y : X
{
sealed protected override void F() { Console.WriteLine("Y.F"); }
protected override void F2() { Console.WriteLine("X.F3"); }
}
class Z : Y
{
// Attempting to override F causes compiler error CS0239.
// protected override void F() { Console.WriteLine("C.F"); }
// Overriding F2 is allowed.
protected override void F2() { Console.WriteLine("Z.F2"); }
}
클래스의 새 메서드 또는 속성을 정의할 때 virtual로 선언하지 않으면 파생 클래스가 재정의되지 않도록 할 수 있습니다.
추상 클래스는 추상 메서드 또는 속성의 구현을 제공하는 클래스에서 상속해야 하므로 봉인 클래스와 함께 abstract 한정자를 사용하면 오류가 발생합니다.
메서드나 속성에 sealed 한정자를 적용하는 경우 항상 override를 함께 사용해야 합니다.
구조체는 암시적으로 봉인되므로 상속할 수 없습니다.
자세한 내용은 상속(C# 프로그래밍 가이드)을 참조하십시오.
sealed class SealedClass
{
public int x;
public int y;
}
class SealedTest2
{
static void Main()
{
SealedClass sc = new SealedClass();
sc.x = 110;
sc.y = 150;
Console.WriteLine("x = {0}, y = {1}", sc.x, sc.y);
}
}
// Output: x = 110, y = 150
위 예제에서 다음 문을 사용하여 봉인 클래스에서 상속할 경우
class MyDerivedC: SealedClass {} // Error
다음 오류 메시지가 나타납니다.
'MyDerivedC' cannot inherit from sealed class 'SealedClass'.
C# 언어 사양
자세한 내용은 C# 언어 사양의 다음 단원을 참조하십시오.
10.1.1.2 봉인 클래스
10.6.5 봉인 메서드
설명
클래스, 메서드 또는 속성을 봉인할지 여부를 결정하려면 일반적으로 다음 두 가지 사항을 고려해야 합니다.
파생 클래스에서 클래스 사용자 지정 기능을 통해 얻을 수 있는 이점
파생 클래스에서 사용자의 클래스를 수정하여 해당 클래스가 더 이상 올바르게 또는 예상대로 작동하지 않게 될 가능성
참고 항목
개념
참조
정적 클래스 및 정적 클래스 멤버(C# 프로그래밍 가이드)
추상 및 봉인 클래스와 클래스 멤버(C# 프로그래밍 가이드)