我发现sealed 关键字有用的实际用途之一是避免“脆弱的类问题”。这是一个视频,显示了一个脆弱的基类问题http://www.youtube.com/watch?v=xnA3RUJcyY4
让我详细解释一下。
考虑下面的场景,我们有一个名为“DbParent”的父类和一个虚拟方法“Insert”。
类 DbParent {
public virtual void Insert()
{
Console.WriteLine("Parent insert");
}
}
下面是一个简单的子类,它有自己的“插入”实现,安装在不同的位置。
class DbChildClass : DbParent
{
public void Insert()
{
Console.WriteLine("Child inserts");
}
}
现在让我们说,经过几个月的部署,父类开发人员在不了解对子类的影响的情况下,去添加一个新方法“Add”。这个“添加”方法在内部调用“插入”方法(下面是相同的代码片段)。
class DbParent
{
public void Add() // Adds method with out consulting
{
this.Insert();
}
public virtual void Insert()
{
Console.WriteLine("Parent insert");
}
}
现在,通过创建子类对象调用“Add”方法的客户端程序期望调用“Child”类“Insert”实现。
DbChildClass o = new DbChildClass();
o.Add();
Console.Read();
但是哇哦,如果你运行下面的代码,你会看到父类“Insert”被调用,这不是预期的。
所以我会把课程标记为“密封”以避免此类问题。