设计模式-离氏替换原则


离氏替换原则:全称“离散子结构替换原则”(Liskov Substitution Principle,简称LSP),是面向对象编程中的一个重要原则,由计算机科学家Barbara Liskov在1987年提出。这个原则是SOLID设计原则之一,专门用于指导类继承的使用。

离氏替换原则的核心思想是:如果S是T的一个子类,那么在任何能够使用T对象的地方都应该可以使用S对象,且程序的行为不会发生改变。

具体来说,LSP要求:

1.子类必须完全实现父类的方法和功能,不能改变父类方法的预期行为或结果。
2.子类可以扩展父类的功能,但不能削弱父类的功能或违反父类的方法签名。
3.子类替代父类时,不能抛出比父类更宽泛的异常。
实践中的应用
遵循LSP可以帮助开发者设计出更为健壮的类继承结构,避免在使用多态时出现意外行为。例如,如果子类不能在所有场景下代替父类,那么这说明子类与父类之间的继承关系可能设计不合理。

违反LSP的案例
假设我们有一个基类 Bird 和一个子类 Penguin,其中 Penguin 继承自 Bird。

public class Bird
{
    public virtual void Fly()
    {
       Debug.Log("这鸟会飞");
    }
}
public class Penguin : Bird
{
    public override void Fly()
    {
        throw new NotImplementedException("企鹅不会飞");
    }
}


在这个例子中,Bird 类有一个 Fly() 方法,假设所有的鸟都可以飞。然而,企鹅是一种不能飞的鸟,所以在 Penguin 类中,我们重写了 Fly() 方法并抛出了 NotImplementedException 异常。

违反LSP的原因:

根据LSP,Penguin 作为 Bird 的子类,应该可以在任何可以使用 Bird 对象的地方使用,而不影响程序的行为。然而,Fly() 方法在 Penguin 类中被实现为抛出异常,导致无法在期望 Bird 对象可以飞行的场景下正常使用。这显然违反了LSP,因为程序行为发生了改变。
改进后的设计
为了遵循LSP,我们可以重新设计类结构,使得 Penguin 不需要重写 Fly() 方法,或者根本不提供 Fly() 方法。我们可以引入一个接口来表示飞行能力。

public interface IFlyable
{
    void Fly();
}
public class Bird
{
   
}
public class Sparrow : Bird, IFlyable
{
    public void Fly()
    {
        Debug.Log("The sparrow is flying.");
    }
}

public class Penguin : Bird
{
    // No Fly() method here because penguins can't fly
}

IFlyable 接口仅由那些可以飞的鸟类实现,如 Sparrow,Penguin 类不实现 IFlyable 接口,因为它不能飞。这样一来,程序中的飞行能力不再与 Bird 类绑定,而是通过 IFlyable 接口分离出来,避免了不合适的继承关系。
结论
通过这种方式,我们确保了 Penguin 类不会在不能飞的情况下实现一个无意义的 Fly() 方法,避免了代码中不必要的复杂性。同时,在需要使用能够飞行的对象时,我们可以依赖 IFlyable 接口,而不必担心传入的对象无法执行飞行操作,从而更好地遵循了LSP。这个案例清楚地展示了如何通过合理的设计避免违反离氏替换原则,从而创建更健壮、灵活的代码结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芊泽散人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值