한정자를 클래스에 sealed 적용하면 다른 클래스가 해당 클래스에서 상속되지 않습니다. 다음 예제에서 클래스 B 클래스 A상속하지만 클래스 B상속할 수 있는 클래스는 없습니다.
class A {}
sealed class B : A {}
기본 클래스의 가상 메서드 또는 속성을 재정의하는 메서드 또는 속성에서 sealed 한정자를 사용할 수도 있습니다. 이 방법을 사용하면 개발자가 특정 가상 메서드 또는 속성을 재정의하지 못하게 하면서 클래스에서 클래스를 파생시킬 수 있습니다.
C# 언어 참조는 가장 최근에 릴리스된 C# 언어 버전을 문서화합니다. 또한 예정된 언어 릴리스의 공개 미리 보기 기능에 대한 초기 설명서도 포함되어 있습니다.
설명서는 언어의 마지막 세 버전 또는 현재 공개 미리 보기에서 처음 도입된 기능을 식별합니다.
팁 (조언)
C#에서 기능이 처음 도입된 시기를 찾으려면 C# 언어 버전 기록에 대한 문서를 참조하세요.
다음 예제 Z 에서는 상속하지만 ZY 에 선언되고 봉인된 XY가상 함수 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("Y.F2"); }
}
class Z : Y
{
// Attempting to override F causes compiler error CS0239.
// protected override void F() { Console.WriteLine("Z.F"); }
// Overriding F2 is allowed.
protected override void F2() { Console.WriteLine("Z.F2"); }
}
클래스에서 새 메서드 또는 속성을 정의할 때 파생 클래스를 가상선언하지 않음으로써 클래스를 재정의하지 못하도록 방지할 수 있습니다.
기본 형식으로 선언된 멤버를 재정의 virtual 하는 경우 다음 예제와 같이 키워드를 사용하여 파생 형식이 재정의 sealed 되지 않도록 방지할 수 있습니다.
public sealed override string ToString() => Value;
추상 메서드 또는 속성의 구현을 제공하는 클래스에서 추상 클래스를 상속해야 하므로 봉인된 클래스에서 추상 한정자를 사용하는 것은 오류입니다.
메서드 또는 속성에 sealed 한정자를 적용하는 경우 항상 재정의와 함께 사용합니다.
구조체는 암시적으로 봉인되므로 상속할 수 없습니다.
자세한 내용은 상속을 참조하세요.
자세한 예시는 추상 및 봉인 클래스와 클래스 멤버을 참조하십시오.
sealed class SealedClass
{
public int x;
public int y;
}
class SealedTest2
{
static void Main()
{
var sc = new SealedClass();
sc.x = 110;
sc.y = 150;
Console.WriteLine($"x = {sc.x}, y = {sc.y}");
}
}
// Output: x = 110, y = 150
이전 예제에서는 다음 문을 사용하여 봉인된 클래스에서 상속하려고 할 수 있습니다.
class MyDerivedC: SealedClass {} // Error
결과는 오류 메시지입니다.
'MyDerivedC': cannot derive from sealed type 'SealedClass'
클래스, 메서드 또는 속성을 봉인할지 여부를 확인하려면 일반적으로 다음 두 가지 사항을 고려합니다.
- 클래스를 사용자 지정할 수 있는 기능을 통해 파생 클래스가 얻을 수 있는 잠재적인 이점.
- 파생 클래스가 더 이상 제대로 또는 예상대로 작동하지 않는 방식으로 클래스를 수정할 수 있습니다.
C# 언어 사양
자세한 내용은 C# 언어 사양참조하세요. 언어 사양은 C# 구문 및 사용의 최종 소스입니다.
참조
.NET