欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > 设计模式-离氏替换原则

设计模式-离氏替换原则

2024/10/26 1:16:43 来源:https://blog.csdn.net/weixin_39543044/article/details/141869738  浏览:    关键词:设计模式-离氏替换原则


离氏替换原则:全称“离散子结构替换原则”(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。这个案例清楚地展示了如何通过合理的设计避免违反离氏替换原则,从而创建更健壮、灵活的代码结构。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com