シールクラスは、基本クラスや抽象クラスになることはできません。
このクラスは、主に派生を防ぐために使用します。
一方、シールメソッドはオーバーライドを拒否することができます。
なぜ、このようなメソッドが必要なのかというと、仮想メソッドのオーバーライドはクラス階層が何段続いてもオーバーライドすることができます。
特定のオーバーライド以降、メソッドをオーバーライドしてほしくない時にシールメソッドを使用します。
これらの宣言には sealed 修飾子を指定します。
- sealed class クラス名 // シールクラス
{
}
シールクラスの使用例。
sealed class SealedClass
{
public void Write()
{
Console.WriteLine("シールクラス");
}
}
// class MyClass : SealedClass // 継承はできないため、エラーが起こります。
class MyClass
{
static void Main()
{
SealedClass sc = new SealedClass(); // 継承が禁止されているだけなので問題ありません。
sc.Write();
}
}
- class クラス名
{
sealed override 戻り値 メソッド名() { } // シールメソッド
}
シールメソッドの使用例
class ClassA
{
public virtual void Write()
{
Console.WriteLine("基底クラス");
}
}
class ClassB : ClassA
{
public sealed override void Write()
{
Console.WriteLine("シールメソッド");
}
}
class ClassC : ClassB
{
// 基底クラスで sealed が指定されているため、オーバーライドはできません。
// public override void Write()
// {
// WriteLine("あれれ");
// }
}
class MyClass
{
static void Main()
{
ClassA cA = new ClassB();
cA.Write(); // シールが指定していない場合は、「あれれ」が出力されます。
}
}