6

如果一个类没有任何虚拟方法,我看不出任何继承类的方式会影响任何没有将实例显式引用为子类实例的代码,即

Subclass obj = new Subclass()

而不是

BaseClass obj = new SubClass()

那么,为什么会sealed存在呢?

如果您没有将任何内容声明为virtual(我认为在密封类中这样做没有意义),那么它所阻止的只是(例如)aListViewItem存储一些关于它代表什么的额外信息,用于“知道”该信息的代码是在那里,与重写方法不同,这对没有考虑到该子类编写的代码没有影响。

4

3 回答 3

6

(1) 密封类

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

(2) 密封件

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

于 2014-03-14T01:31:11.407 回答
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 
}

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

于 2014-03-14T01:30:01.367 回答
0

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

为什么要封类?

于 2014-03-14T01:44:05.887 回答