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

lee*_*eza 37 c# inheritance overriding

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

SLa*_*aks 39

只能virtual覆盖方法.
请稍等处理virtual,您的方法将无法覆盖.


sca*_*man 35

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

检查一下:密封方法

  • 错误.`sealed`关键字只能用于重写方法以防止进一步覆盖; 这不是他所要求的. (7认同)
  • 嗯,除非OP谈论虚拟方法,否则这个问题没有任何意义.让我们试着为明智的问题提供明智的答案.这个答案是明智的. (7认同)

Kei*_*thS 15

是.的sealed关键字也可以在方法中使用,以指示这是在较高继承层次虚拟或抽象的方法不能被进一步继承.

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

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


Jam*_*man 10

您可以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();
}
Run Code Online (Sandbox Code Playgroud)

仍然从原始(现在派生)的抽象类派生您的具体类:

class Document1_FromTemplate : DocumentTemplate
{
    public override void WriteTitle() //error!
    {
        Console.WriteLine("Project1 document");
    }
Run Code Online (Sandbox Code Playgroud)

"无法覆盖继承的成员'Dynamics.DocumentTemplate.WriteTitle()'因为它是密封的"

然而,没有什么可以阻止实施者使用new它:

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


Bar*_*dia 6

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

  1. 在一个类之前避免继承.
  2. 在避免覆盖的功能之前.

要允许继承,请不要sealed在类之前放置关键字,并避免sealed在不希望被覆盖的函数之前覆盖put .