他のクラスが特定のクラスを継承するのを防ぐためにシールを使用できることを知っていますが、継承を許可して一部の仮想メソッドのオーバーライドを防ぐことは可能ですか?
オーバーライドできるのはvirtual
メソッドのみです。virtual
を省くだけで、メソッドはオーバーライドできなくなります。
また、密封された修飾子を使用して、派生クラスがメソッドをさらにオーバーライドしないようにすることもできます。
これをチェックしてください: Sealed methods
はい。 sealed
キーワードをメソッドで使用して、より高い継承レベルで仮想または抽象メソッドをさらに継承できないことを示すこともできます。
メソッドが最初から仮想的または抽象的でなかった場合でも、心配はありません。上書きすることはできません。
sealed
はメソッドのオーバーライドにのみ影響することに注意してください。 method hidingはこの方法で停止できないため、子クラスは、シールされたメソッドと同じ名前とシグネチャのnew
メソッドを宣言できます。
抽象クラス自体を何かから派生させることで、sealed
キーワードを取得して、抽象クラスのメソッドを処理できます。
abstract class DocumentTemplateBase
{
public abstract void WriteTitle();
public abstract void WriteSections();
}
abstract class DocumentTemplate : DocumentTemplateBase
{
public override sealed void WriteTitle()
{
Console.WriteLine("Project document");
}
public override sealed void WriteSections()
{
Console.WriteLine("Sections");
}
abstract public void WriteContent();
}
元の(現在は派生した)抽象クラスから具象クラスを引き続き派生させます。
class Document1_FromTemplate : DocumentTemplate
{
public override void WriteTitle() //error!
{
Console.WriteLine("Project1 document");
}
「継承されたメンバー 'Dynamics.DocumentTemplate.WriteTitle()'はシールされているため、オーバーライドできません。 "
ただし、実装者がそれをnew
ingできないようにするものはありません。
class Document1_FromTemplate : DocumentTemplate
{
public new void WriteTitle() //sorry! can't stop it!
{
Console.WriteLine("Project1 document");
}
sealed
キーワードは、次の2つの方法で使用できます。
継承を許可するには、クラスの前にsealed
キーワードを置かないでください。また、オーバーライドしたくない関数の前にsealed
をオーバーライドしないでください。
はい。あなたはそれを達成するメソッドのために封印されたオーバーライドを使用する必要があります。