web-dev-qa-db-ja.com

C#での個々のメソッドのオーバーライドの防止

他のクラスが特定のクラスを継承するのを防ぐためにシールを使用できることを知っていますが、継承を許可して一部の仮想メソッドのオーバーライドを防ぐことは可能ですか?

39
leeza

オーバーライドできるのはvirtualメソッドのみです。
virtualを省くだけで、メソッドはオーバーライドできなくなります。

40
SLaks

また、密封された修飾子を使用して、派生クラスがメソッドをさらにオーバーライドしないようにすることもできます。

これをチェックしてください: Sealed methods

35
scatman

はい。 sealedキーワードをメソッドで使用して、より高い継承レベルで仮想または抽象メソッドをさらに継承できないことを示すこともできます。

メソッドが最初から仮想的または抽象的でなかった場合でも、心配はありません。上書きすることはできません。

sealedはメソッドのオーバーライドにのみ影響することに注意してください。 method hidingはこの方法で停止できないため、子クラスは、シールされたメソッドと同じ名前とシグネチャのnewメソッドを宣言できます。

14
KeithS

抽象クラス自体を何かから派生させることで、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()'はシールされているため、オーバーライドできません。 "

ただし、実装者がそれをnewingできないようにするものはありません。

class Document1_FromTemplate : DocumentTemplate
{
    public new void WriteTitle() //sorry! can't stop it!
    {
        Console.WriteLine("Project1 document");
    }
9
James Wiseman

sealedキーワードは、次の2つの方法で使用できます。

  1. 継承を避けるためにクラスの前。
  2. オーバーライドを回避する関数の前。

継承を許可するには、クラスの前にsealedキーワードを置かないでください。また、オーバーライドしたくない関数の前にsealedをオーバーライドしないでください。

6
Bardia

はい。あなたはそれを達成するメソッドのために封印されたオーバーライドを使用する必要があります。

1
Aravind