LSP The The Liskov Substitution Principle

2024-01-23 17:08

本文主要是介绍LSP The The Liskov Substitution Principle,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载: http://blog.csdn.net/robinvane/ 

LSP The The Liskov Substitution Principle
OCP原则背后的主要机制是抽象多态。支持抽象和多态的关键机制是继承。

LSP的定义
若对于每一个类型P的对象p1,都存在一个类型C的对象c1,使得在所有针对C编写的程序P中,用p1替换c1后,程序P的行为功能不变,则C是P的子类型。
LSP原则清楚地指出,OOD中IS-A关系是就行为功能而言。 行为功能(behavior)不是内在的、私有的,而 是外在、公开的,是客户程序所依赖的。行为功能(behavior)才是软件所关注的问题! 所有派生类的行为功能必须和客户程序对其基类所期望的保持一致
例如如下设计:
public class Rectangle
{
 private long width;
 private long height;
 public void setWidth(long width){
  this.width=width;
 }
 public void setHeight(long height){
  this.height=height;
 }
 public long getWidth(){
  return width;
 }
 public long getHeight(){
  return height;
 }
 public void resizeWidth(){
  width++;
 }
};

public class Square : Rectangle
{
 public void setWidth(long width){
  this.width=width;
  this.height=width;
 }
 public void setHeight(long height){
  this.width=width;
  this.height=width;
 }
 public void resizeWidth(){
  width++;
  height++;
 }
};
并不是一个合理的设计,Square继承了Rectangle的接口,但是从Square本身来看,setWidth,setLength接口的设立并不合理,导致代码所表达的意义与基类的不同。
DBC(Design by Contract)定义把类和其客户之间的关系看作是一个正式的协议,明确各方的权利和义务。DBC对类的要求类的方法声明为先决条件(precondition)和后续条件(postcondition)。为了让方法得以执行,先决条件必须为真。完成后,方法保证后续条件为真。 DBC对派生类的要求当重新定义派生类中的例行程序时,我们只能用更弱的先决条件和更强的后续条件替换之
LSP原则是符合OCP原则应用程序的一项重要特性。仅当派生类能完全替换基类时,我们才能放心地重用那些使用基类的函数和修改派生类型。

这篇关于LSP The The Liskov Substitution Principle的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/636942

相关文章

设计模式原则:里氏替换原则(Liskov Substitution Principle, LSP)

定义 LSP由Barbara Liskov于1987年提出,一般有两种定义方式: 第一种:If for each object O1 of type S there is an object O2 fo type T such that for all programs P defined in terms of T, the behavior of P is unchanged when

【大家的项目】新弄了一个LSP服务的库

前段时间在用 rust 实现 vscode 的 lsp 服务, 虽然 ra 已经开发出了相关库, 但用着不是很舒服, 所以我自己弄了一个 LSP 相关的组件. 目前包含2个库 lsp-ty LSP 规范中提到的类型, 这些都是 rust 原生类型, 没有任何 binding, 以及一些辅助 traitlsp-io 提供从 tcpstream 或 stdio 等读写协议消息的包装. 目前仓库还提供

模板编程中实现 SFINAE(Substitution Failure Is Not An Error)

在C++模板编程中,std::enable_if 是一个常用的工具,它依赖于 SFINAE(Substitution Failure Is Not An Error)原则来控制模板的启用或禁用。理解 std::enable_if 如何工作,可以更清楚地看到为什么 disable_if_same_or_derived 在某些情况下等同于 void 类型。 std::enable_if 的工作原理

RANSAC与LSP

最近又要用到ransac算法,之前学过也用过,但是好久没用,只知道是干什么用的,现在来重新总结一下,再来复习一遍:        Ransac和最小二乘法都用于模型的最优估计;RANSAC是考虑局部有用的那些数据,取有用数据的模型;LSP考虑的是全局数据,取全局误差最小的模型 一、基础原理: RANSAC:称为随机抽样一致算法(random sample consensus,RANSAC),

Liskov替换原则

Liskov替换原则 文章目录 Liskov替换原则案例引入如何理解 子类型可以替换 基类型 ?违反LSP的危害总结参考文档 今天我继续来说 软件设计的另一个原则, LSP原则 里氏代换原则 英文缩写: LSP , 全称: Liskov Substitution Principle 来源 : 它由芭芭拉·利斯科夫(Barbara Liskov)在1987年在一次会议上名

LSP(Layered Service Provider )---子浏览器被劫持

学习原因是使用谷歌浏览器在京东买东西的时候,突然加载页面正常,出现了书签无法打开。上网搜索原来是Lsp出现问题,浏览器被恶意修改。然后呢?就下面了 ,你都懂得....... LSP就是TCP/IP等协议的接口.LSP用在正途上可以方便程序员们编写监视系统网络通讯情况的Sniffer,可是现在常见的LSP都被用于浏览器劫持。 例:“浏览器劫持”后出现的症状: 被重定向到

开放封闭原则(Open Closed Principle)

在面向对象的设计中有很多流行的思想,比如说 “所有的成员变量都应该设置为私有(Private)”,“要避免使用全局变量(Global Variables)”,“使用运行时类型识别(RTTI:Run Time Type Identification,例如 dynamic_cast)是危险的” 等等。那么,这些思想的源泉是什么?为什么它们要这样定义?这些思想总是正确的吗?本篇文章将介绍这些思想的基础:

设计模式:合成复用原则(Composite Reuse Principle,CRP)介绍

合成复用原则(Composite Reuse Principle,CRP)是面向对象设计原则之一,它强调通过组合已有的对象来实现新的功能,而不是通过继承已有的类来实现。合成复用原则的核心思想是尽量使用对象组合而不是类继承,从而使系统更加灵活、可复用和可维护。 该原则的实现原理可以通过以下几点来说明: 通过组合实现代码复用: 将已有的类组合在一起,形成一个新的类,新的类可以通过调用组合类的

设计模式:里氏代换原则(Liskov Substitution Principle,LSP)介绍

里氏代换原则(Liskov Substitution Principle,LSP)是面向对象设计原则的一部分,它强调子类对象应该能够替换其父类对象而不影响程序的正确性。换句话说,子类对象应该可以在不改变程序正确性的前提下替换掉父类对象。 该原则的实现原理可以通过以下几点来说明: 子类必须完全实现父类的抽象方法: 子类继承父类时,必须实现父类中声明的所有抽象方法,并且保持方法签名和语义的一