当"虚拟"是可选的时,C#中"密封"的目的是什么?

fla*_*006 6 c# oop inheritance class sealed

如果一个类没有任何虚方法,我认为继承类的任何方式都不会影响任何未明确引用该实例作为子类实例的代码,即

Subclass obj = new Subclass()
Run Code Online (Sandbox Code Playgroud)

而不是

BaseClass obj = new SubClass()
Run Code Online (Sandbox Code Playgroud)

因此,为什么sealed甚至存在?

如果你没有声明任何东西virtual(我认为在密封类中没有任何意义),它会阻止像(例如)a ListViewItem那样存储一些关于它代表什么的额外信息的代码"知道"该信息是在那里,与重写的方法不同,它对没有用该子类编写的代码没有影响.

Jay*_*Jay 6

(1)密封类

我可能有一个接受类型对象的方法BankAccount.我不希望你能够创建EvilBankAccount : BankAccount并将其传递给我的方法.EvilBankAccount可能会破坏我的系统,这个系统会假设BankAccount- 例如,它可以被序列化.也许我克隆BankAccount以防止外部操作一旦提交,EvilBankAccount克隆就好了,但在其构造函数中启动一个计时器,每30秒自动增加一次平衡.

(2)密封件

您可以覆盖虚拟方法或属性,但将其密封以使其无法在继承层次结构中进一步覆盖.这里的一个用例是当您需要从构造函数访问该成员时.


Mar*_*wul 0

考虑

class A
{
  public virtual void M1();
  public void M2();
}

class B : A
{
  public override sealed void M1();
}

sealed class C : A
{
   //other stuff    
}

class D : A
{
   public new void M2(); //marking A as sealed would prevent this 
}
Run Code Online (Sandbox Code Playgroud)

另请参阅: 密封类真的能提供性能优势吗? (JITter 在知道不能有子类时可以优化某些调用)