派生的 class 能否破坏基础 class 的实现
can a derived class corrupt base class's implementation
我是 c# 的新手,正在研究密封 class,当我遇到
这个
'密封的 class 主要用于安全原因,通过防止
意外推导,派生 class 可能会破坏基础 class'
中提供的实现
这真的可能吗?派生的 class 真的会破坏基础 class 的实现吗?如果可以,请有人举例说明。
由于多态性,您可能会破坏基础 class 实现。
如果 class A
有一个可以覆盖的 virtual
方法(即 多态 )和一个 class B
覆盖了整个方法,并且 B
不会输出与 A
的实现相同的东西,那么,似乎 B
已经改变了 [= 的实际行为11=]的实施。
sealed
in class level (f.e. override sealed
) 是为了在整个class.[=上同时避免继承和多态21=]
您还可以防止某些成员的多态性(仍然可以继承)在派生 class 中覆盖它们并使用 sealed
修饰符标记它们:
public class A
{
public virtual void DoStuff() {}
}
public class B
{
public override sealed void DoStuff() {}
}
说你需要一些看门人:
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 仅此而已。
假设您在 class 中定义并实现了一个方法,在您的程序中您只需要这个实现。例如,您 return 向用户发送一条消息,每当您调用此方法时,您希望该特定消息被 return 编辑,考虑您有一个子 class 覆盖该方法并显示另一条消息,当您调用该方法时,您会得到另一个意想不到的结果,如果您将 class 标记为密封的,则可以防止意外继承。
密封是抽象设计硬币的正面。当您定义一个抽象 class 时,您允许 classes 从它派生并实现他们自己的方法实现,但 sealed class 根本不允许其他人派生它。
我是 c# 的新手,正在研究密封 class,当我遇到 这个
'密封的 class 主要用于安全原因,通过防止 意外推导,派生 class 可能会破坏基础 class'
中提供的实现这真的可能吗?派生的 class 真的会破坏基础 class 的实现吗?如果可以,请有人举例说明。
由于多态性,您可能会破坏基础 class 实现。
如果 class A
有一个可以覆盖的 virtual
方法(即 多态 )和一个 class B
覆盖了整个方法,并且 B
不会输出与 A
的实现相同的东西,那么,似乎 B
已经改变了 [= 的实际行为11=]的实施。
sealed
in class level (f.e. override sealed
) 是为了在整个class.[=上同时避免继承和多态21=]
您还可以防止某些成员的多态性(仍然可以继承)在派生 class 中覆盖它们并使用 sealed
修饰符标记它们:
public class A
{
public virtual void DoStuff() {}
}
public class B
{
public override sealed void DoStuff() {}
}
说你需要一些看门人:
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 仅此而已。
假设您在 class 中定义并实现了一个方法,在您的程序中您只需要这个实现。例如,您 return 向用户发送一条消息,每当您调用此方法时,您希望该特定消息被 return 编辑,考虑您有一个子 class 覆盖该方法并显示另一条消息,当您调用该方法时,您会得到另一个意想不到的结果,如果您将 class 标记为密封的,则可以防止意外继承。 密封是抽象设计硬币的正面。当您定义一个抽象 class 时,您允许 classes 从它派生并实现他们自己的方法实现,但 sealed class 根本不允许其他人派生它。