`
nathan09
  • 浏览: 155398 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

一个简单的示例揭秘LSP原则真谛

 
阅读更多

对LSP的理解,之前只停留在表面,并未深入理解。表面理解是指认为LSP就是仅仅依靠面向对象多态的特性,在使用基类对象的地方都能使用子类对象简单的替换。这还不是严格的遵循LSP。真正的要遵循LSP原则,是必须子类和基类行为上的绝对一致。基于契约的设计可以很好的保证了对LSP的遵循。

下面简单的java代码,揭示了LSP真谛:

package com.oop.lsp;

public class Base {
	public void lspViolate(String s1, String s2) {
	}

	public void lspFollow(String s1, String s2) {
		assert s1 != null;
	}
}
////////////////

package com.oop.lsp;

public class Derived extends Base {
	@Override
	public void lspViolate(String s1, String s2) {
		assert s1 != null;
		super.lspViolate(s1, s2);
	}

	@Override
	public void lspFollow(String s1, String s2) {
		super.lspFollow(s1, s2);
	}
}
///////////////

package com.oop.lsp;

public class Client {
	public void lspViolate(Base obj) {
		obj.lspViolate(null, null);
	}

	public void lspFollow(Base obj) {
		obj.lspFollow("", null);
	}
}
/////////////
package com.oop.lsp;

import org.junit.Test;

public class LspTest {
	/**
	 * 测试违反LSP
	 */
	@Test
	public void testLspViolate() {
		Client client = new Client();
		Base base = new Base();
		Base derived = new Derived();
		client.lspViolate(base);

		// 当用派生类对象替换基类对象时,发生AssertError 说明违反了LSP原则,因为派生类的方法前置条件比基类更加严格了
		client.lspViolate(derived);
	}

	/**
	 * 测试遵循LSP
	 */
	@Test
	public void testLspFollow() {
		Client client = new Client();
		Base base = new Base();
		Base derived = new Derived();
		client.lspFollow(base);
		client.lspFollow(derived);
	}
}



从测试代码 testLspViolate看出,当用派生类对象替换基类对象时,发生AssertError 说明违反了LSP原则,因为派生类的方法前置条件比基类更加严格了。

参考:基于契约的设计

分享到:
评论

相关推荐

    Lsp最好的入门示例.rar_LSP WSPStartup_Lsp最好的入门示例_lsp 拦截_lsp文件范本_lsp编程

    在这个压缩包中,"**Lsp最好的入门示例**"很可能是包含了一系列的教程或者代码实例,这些实例可能逐步引导你完成一个完整的LSP服务开发流程,从基础的服务器设置到复杂的交互逻辑。通过实践这些示例,你可以深入理解...

    里氏代换原则案例程序LSP.zip

    - "NewLSP"示例:这个程序可能包含了一个违反LSP的例子,比如子类重写了基类的方法,导致了不同的行为或者错误,从而说明了不遵循LSP的潜在问题。 4. **如何遵循里氏代换原则**: - 不增加新的公有方法或属性。 ...

    LSPInject.rar_LSP拦截ftp_c++ lsp 注入_lsp inject_socket拦截_socket注入

    标题中的“LSPInject.rar”可能是一个包含有关Local Service Provider(LSP)注入技术的压缩文件,特别是关于如何使用C++编程语言实现对FTP(文件传输协议)通信的拦截。LSP是Windows操作系统中用于网络应用程序的一...

    cad经典LSP文件

    cad经典LSP文件,各种应用实例 如果您使用 AutoCAD,下面的内容对您一定有帮助。在某些方面能大大提高 您的工作效率。下面的程序均以源程序方式给出,您可以使用、参考、修改它。 bg.lsp --- 表格自动生成 asc.lsp -...

    fas2lsp反编译工具包new.zip

    同时,压缩包内还有一个同名的“fas2lsp反编译工具包.zip”文件,这可能是一个备份或者更新版本的工具包,或者包含了一些额外的资源和示例。用户可能需要解压这个文件以获取更多内容,然后按照文档中的指示进行操作...

    ss.zip_lsp程序_多段线_多段线闭合 lsp_面积lsp_面积标注

    标题中的“ss.zip_lsp程序_多段线_多段线闭合 lsp_面积lsp_面积标注”指的是一个名为“ss”的ZIP压缩文件,其中包含了一个LISP(AutoLISP)程序,这个程序主要用于处理CAD(计算机辅助设计)中的多段线(POLYLINE)...

    面向对象设计原则(SRP,OCP,LSP,DIP,ISP)

    面向对象 设计原则 单一职责原则--SRP 开放封闭原则--OCP Liskov替换原则--LSP 依赖倒置原则--DIP 接口隔离原则--ISP

    lsp集合学习专用lsp集合学习专用

    lsp集合学习专用lsp集合学习专用lsp集合学习专用

    fas2lsp.rar

    标题“fas2lsp.rar”指的是一个压缩包文件,其中包含了一个名为“fas2lsp.exe”的可执行程序。这个程序的主要功能是将CAD(计算机辅助设计)的 fas 文件转换成 lsp 文件。fas 和 lsp 文件是AutoCAD软件中两种不同的...

    LSP钩子程序 VC++实现

    在这个场景下,我们讨论的是一个使用VC++编写的LSP钩子程序,它覆盖了TCP、UDP和RAW协议,从而能够对这三种协议的数据传输进行深度控制。 首先,我们要理解LSP的工作原理。LSP通过注册为系统服务提供商,可以在网络...

    Delphi LSP Hook 过滤广告

    1. **创建LSP服务**: 使用Delphi,我们需要编写一个动态链接库(DLL),该库将作为LSP实现。这个DLL需要实现特定的接口,如WS2_32.dll中的`Winsock2`接口,以便能够接管网络通信。 2. **注册LSP**: 在系统中注册LSP...

    cad经典LSP文件大放送

    pb.lsp --- 通过给出长度将字符串分成两个串 cht.lsp --- 直接修改文字内容或块属性 ct.lsp --- 对数字串进行加减 chh.lsp --- 直接修改文字高度 chhw.lsp --- 直接修改文字高宽比(针对PKPM软件将字符定位点改为...

    高程点内插_等高线lsp_内插高程lsp_高程点_高程_高程点内插lsp_

    "高程点内插.lsp"这个文件很可能就是一个LISP程序,它的功能可能是读取用户输入的高程点或等高线数据,然后通过内插算法计算出新的高程点。 在实际应用中,这种LSP程序可以帮助工程师和地理信息专业人员快速生成高...

    cad lsp c程序

    LSP程序的一个关键优势在于其可扩展性。如果你对现有的功能不满意,或者有特殊需求,你可以自行修改LSP代码,或者根据需求编写新的程序。学习AutoLISP语言并不复杂,一旦掌握,就可以为个人或团队的工作带来巨大的...

    lsp_dataset.zip

    简单来说,它是计算机视觉领域中的一个任务,旨在确定图像或视频中人物各个身体部位的位置和相对关系。这项技术的核心在于对图像进行分析,识别出如肩、肘、腕、髋、膝和脚踝等关键点,从而理解人物的动作和姿态。 ...

    设计原则示例代码

    在面向对象编程(OOP)领域,设计原则是构建可扩展、可维护和高效软件的基础。这些原则指导我们如何组织代码,使其遵循良好的...在压缩包中,每个原则的实现都应该有清晰的注释和解释,帮助我们更好地理解和应用它们。

    lsp大全cad

    对于初学者来说,这种集合提供了一个便捷的途径来学习和使用AutoCAD的高级功能。 在描述中,“加载即可,简单方便使用,快捷适合初学者!”意味着这个压缩包包含的LSP文件设计得非常用户友好,用户只需将其加载到...

    LSP测试代码包含测试和安装程序

    标题“LSP测试代码包含测试和安装程序”指出,这是一个与LSP(Layered Service Provider)相关的项目,其中包含了用于测试LSP功能的代码以及安装该服务的程序。LSP是一种Windows系统下的网络层接口,允许开发者在...

    LSP spi 劫持

    1. **编写LSP插件**:首先,开发者需要创建一个符合LSP接口规范的动态链接库(DLL),该库包含处理网络数据包的函数。 2. **注册LSP**:然后,使用SPI调用`WSPStartup`和`WSPInstallProvider`等函数将LSP插件注册到...

    CAD vlx 转 lsp 步骤1

    以下是一个简单的转换步骤: 1. **获取转换工具**:根据描述,我们有一个名为"vlx2fas.exe"的工具,它能将VLX文件转换为中间格式FAS(Fast LISP)。这个工具可以在Windows 7 64位系统上的虚拟机环境中运行,并且...

Global site tag (gtag.js) - Google Analytics