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

时间:2014-03-14 01:25:24

标签: c# class oop inheritance sealed

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

Subclass obj = new Subclass()

而不是

BaseClass obj = new SubClass()

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

如果您没有宣布任何virtual(我认为在密封课程中没有任何意义),那么它会阻止(例如)ListViewItem存储一些关于它代表的代码的额外信息"知道"那些信息在那里,对于那些没有用该子类编写的代码没有影响,与被覆盖的方法不同。

3 个答案:

答案 0 :(得分:6)

(1)密封班

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

(2)密封成员

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

答案 1 :(得分: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 
}

另见: Do sealed classes really offer performance Benefits? (当它知道没有子类时,JITter可以优化某些调用)

答案 2 :(得分:0)

我个人不会从密封类中受益很多,并且同意,在处理UI类并希望通过继承添加一些自定义行为时,这可能会令人沮丧。 但是,我在这里找到了一个提供一些想法的答案。

Why seal a class?