Say вам нужны ворота хранители:
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 ...
}
А также реализацию для VIP-зал:
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 больше ничего.
Это зависит от значения слова «коррумпированный» и дизайна базового класса. Но, например, если у вас есть тип, который должен быть неизменным, но не запечатан, тогда любой может создать из него модифицируемый класс - даже если состояние в базовом классе остается неизменным, разработчики не смогут полагаться на сам класс, являющийся неизменным. –