当我遇到时,我对c#很新,正在研究密封课程 此
'密封类主要是出于安全原因通过预防使用 派生类可能会破坏基类中提供的实现的意外派生'
这真的有可能吗?派生类真的可以破坏基类的实现吗?如果是这样,有人可以用一个例子来解释。
答案 0 :(得分:1)
说你需要一些看门人:
public interface IGateKeeper
{
/// <summary>
/// Check if the given id is allowed to enter.
/// </summary>
/// <param name="id">id to check.</param>
/// <param name="age">age to check</param>
/// <returns>A value indicating whether the id is allowed to enter.</returns>
bool CanEnter(string id, int age);
... other deep needs ...
}
你可以有一个可靠的实施方法来测试你酒吧入口处的大多数人:
public class MajorityGateKeeper : IGateKeeper
{
public virtual bool CanEnter(string id, int age)
{
return age >= 18;
}
... other deep implementation ...
}
还有贵宾室的实施:
public class VipGateKeeper : MajorityGateKeeper
{
public override bool CanEnter(string id, int age)
{
// Do the majotity test and check if the id is VIP.
return base.CanEnter(id, age) && (id == "Chuck Norris");
}
}
并在一秒内打破它:
public class DrunkGateKeeper : VipGateKeeper
{
public override bool CanEnter(string id, int age)
{
return true;
}
}
DrunkGateKeeper是一个VipGateKeeper,所以你可以隐藏它的醉酒(强制转换为VipGateKeeper)。但它做得很糟糕。
var gk = (VipGateKeeper) new DrunkGateKeeper();
var canEnter = gk.CanEnter("Miley Cyrus", 16); // true (sic)
如果你把VipGateKeeper密封了,你就确定它不会被喝醉:VipGateKeeper 类型的对象只是一个VipGateKeeper。
答案 1 :(得分:0)
由于多态,您可能会损坏基类实现。
如果类A
具有可以覆盖的virtual
方法(即多态),并且类B
会覆盖整个方法,并且{{1我没有输出与B
实现相同的内容,似乎A
改变了B
的实际行为实施
A
)中的 sealed
旨在避免整个类的继承和多态。
您也可以阻止某些成员覆盖派生类并使用override sealed
修饰符标记它们的多态(继承仍然可行):
sealed
答案 2 :(得分:0)
考虑您在类中定义并实现了一个方法,在您的程序中只需要这个实现。例如,您向用户返回一条消息,每当您调用此方法时,您希望返回特定消息,请考虑您有一个子类覆盖该方法并显示另一条消息,当您调用该方法时,您有另一个不期望的结果,如果您将类标记为已密封,则可以防止意外继承。 密封是抽象的设计硬币的正面。当你定义一个抽象类时,你允许类从它派生并实现它们自己的方法实现,但是密封类根本不允许其他人派生它。