2014-03-14 25 views
5

如果一个类没有任何虚方法,我没有看到任何方式继承一个类将影响并没有明确指实例作为子类的实例,即当“虚拟”是可选的时,C#中“密封”的目的是什么?

Subclass obj = new Subclass() 

,而任何代码比

BaseClass obj = new SubClass() 

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

如果你没有任何声明作为virtual(我看到在一个密封类做没有意义),所有它可以防止事情是像(例如)ListViewItem存储关于它所代表的代码一些额外的信息“知道”该信息在那里,不会影响未考虑该子类的代码,与重写的方法不同。

+1

有更多的“明显”的答案,但如果一个类在CLR之上,而不是直接在C#代码实现和扩展它会分手呢? –

回答

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? (抖动可以优化某些呼叫时,它知道不可能有子类)

5

(1)密封类

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

(2)密封部件

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

+0

我不确定我是否购买了这个'EvilBankAccount'位,如果我真的想调用你的方法 - 我不能只用反射吗? –

+0

如果您愿意,可以使用反射调用该方法,但是如果我已经密封它,您仍然无法创建并传入从“BankAccount”派生的任何内容。 – Jay

+0

我同意,这不是一个信任或安全问题,因为它是一种防止滥用API的方法,可能导致它无法使用。然而,这不是答案的本质。 – HackedByChinese

0

我个人没有太大的密封类受益,并同意与UI类处理,并希望只通过继承添加一些自定义的行为时,它可以是令人沮丧的。 但是,我在这里找到了一个答案,提供了一些想法。

Why seal a class?