我知道我可以使用密封以防止其他类继承某个类, 但是是否可以允许继承,但是可以防止覆盖某些虚拟方法?
答案 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
关键字:
要允许继承,请不要在类之前放置sealed
关键字,并且要避免在不希望被覆盖的函数之前覆盖put sealed
。
答案 5 :(得分:1)
是。你需要使用密封覆盖来实现它。