防止在C#中覆盖单个方法

时间:2011-03-11 15:12:45

标签: c# inheritance override

我知道我可以使用密封以防止其他类继承某个类, 但是是否可以允许继承,但是可以防止覆盖某些虚拟方法?

6 个答案:

答案 0 :(得分:39)

只能覆盖virtual个方法 只需忽略virtual,您的方法就不会被覆盖。

答案 1 :(得分:32)

您还可以使用sealed修饰符来防止派生类进一步覆盖该方法。

检查一下:Sealed methods

答案 2 :(得分:14)

是。 sealed关键字也可用于方法,以指示无法继承更高继承级别的虚拟或抽象方法。

如果该方法从不虚拟或抽象开始,不用担心;它不能被覆盖。

请注意sealed仅影响方法覆盖;方法隐藏不能以这种方式停止,因此子类仍然可以声明与密封方法具有相同名称和签名的new方法。

答案 3 :(得分:9)

您可以通过使抽象类本身派生自某事物来获取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

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

答案 4 :(得分:6)

您可以通过两种方式使用sealed关键字:

  1. 在课前避免继承。
  2. 在避免覆盖的功能之前。
  3. 要允许继承,请不要在类之前放置sealed关键字,并且要避免在不希望被覆盖的函数之前覆盖put sealed

答案 5 :(得分:1)

是。你需要使用密封覆盖来实现它。