对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最好的入门示例**"很可能是包含了一系列的教程或者代码实例,这些实例可能逐步引导你完成一个完整的LSP服务开发流程,从基础的服务器设置到复杂的交互逻辑。通过实践这些示例,你可以深入理解...
- "NewLSP"示例:这个程序可能包含了一个违反LSP的例子,比如子类重写了基类的方法,导致了不同的行为或者错误,从而说明了不遵循LSP的潜在问题。 4. **如何遵循里氏代换原则**: - 不增加新的公有方法或属性。 ...
标题中的“LSPInject.rar”可能是一个包含有关Local Service Provider(LSP)注入技术的压缩文件,特别是关于如何使用C++编程语言实现对FTP(文件传输协议)通信的拦截。LSP是Windows操作系统中用于网络应用程序的一...
cad经典LSP文件,各种应用实例 如果您使用 AutoCAD,下面的内容对您一定有帮助。在某些方面能大大提高 您的工作效率。下面的程序均以源程序方式给出,您可以使用、参考、修改它。 bg.lsp --- 表格自动生成 asc.lsp -...
同时,压缩包内还有一个同名的“fas2lsp反编译工具包.zip”文件,这可能是一个备份或者更新版本的工具包,或者包含了一些额外的资源和示例。用户可能需要解压这个文件以获取更多内容,然后按照文档中的指示进行操作...
标题中的“ss.zip_lsp程序_多段线_多段线闭合 lsp_面积lsp_面积标注”指的是一个名为“ss”的ZIP压缩文件,其中包含了一个LISP(AutoLISP)程序,这个程序主要用于处理CAD(计算机辅助设计)中的多段线(POLYLINE)...
面向对象 设计原则 单一职责原则--SRP 开放封闭原则--OCP Liskov替换原则--LSP 依赖倒置原则--DIP 接口隔离原则--ISP
lsp集合学习专用lsp集合学习专用lsp集合学习专用
标题“fas2lsp.rar”指的是一个压缩包文件,其中包含了一个名为“fas2lsp.exe”的可执行程序。这个程序的主要功能是将CAD(计算机辅助设计)的 fas 文件转换成 lsp 文件。fas 和 lsp 文件是AutoCAD软件中两种不同的...
在这个场景下,我们讨论的是一个使用VC++编写的LSP钩子程序,它覆盖了TCP、UDP和RAW协议,从而能够对这三种协议的数据传输进行深度控制。 首先,我们要理解LSP的工作原理。LSP通过注册为系统服务提供商,可以在网络...
1. **创建LSP服务**: 使用Delphi,我们需要编写一个动态链接库(DLL),该库将作为LSP实现。这个DLL需要实现特定的接口,如WS2_32.dll中的`Winsock2`接口,以便能够接管网络通信。 2. **注册LSP**: 在系统中注册LSP...
pb.lsp --- 通过给出长度将字符串分成两个串 cht.lsp --- 直接修改文字内容或块属性 ct.lsp --- 对数字串进行加减 chh.lsp --- 直接修改文字高度 chhw.lsp --- 直接修改文字高宽比(针对PKPM软件将字符定位点改为...
"高程点内插.lsp"这个文件很可能就是一个LISP程序,它的功能可能是读取用户输入的高程点或等高线数据,然后通过内插算法计算出新的高程点。 在实际应用中,这种LSP程序可以帮助工程师和地理信息专业人员快速生成高...
LSP程序的一个关键优势在于其可扩展性。如果你对现有的功能不满意,或者有特殊需求,你可以自行修改LSP代码,或者根据需求编写新的程序。学习AutoLISP语言并不复杂,一旦掌握,就可以为个人或团队的工作带来巨大的...
简单来说,它是计算机视觉领域中的一个任务,旨在确定图像或视频中人物各个身体部位的位置和相对关系。这项技术的核心在于对图像进行分析,识别出如肩、肘、腕、髋、膝和脚踝等关键点,从而理解人物的动作和姿态。 ...
在面向对象编程(OOP)领域,设计原则是构建可扩展、可维护和高效软件的基础。这些原则指导我们如何组织代码,使其遵循良好的...在压缩包中,每个原则的实现都应该有清晰的注释和解释,帮助我们更好地理解和应用它们。
对于初学者来说,这种集合提供了一个便捷的途径来学习和使用AutoCAD的高级功能。 在描述中,“加载即可,简单方便使用,快捷适合初学者!”意味着这个压缩包包含的LSP文件设计得非常用户友好,用户只需将其加载到...
标题“LSP测试代码包含测试和安装程序”指出,这是一个与LSP(Layered Service Provider)相关的项目,其中包含了用于测试LSP功能的代码以及安装该服务的程序。LSP是一种Windows系统下的网络层接口,允许开发者在...
1. **编写LSP插件**:首先,开发者需要创建一个符合LSP接口规范的动态链接库(DLL),该库包含处理网络数据包的函数。 2. **注册LSP**:然后,使用SPI调用`WSPStartup`和`WSPInstallProvider`等函数将LSP插件注册到...
以下是一个简单的转换步骤: 1. **获取转换工具**:根据描述,我们有一个名为"vlx2fas.exe"的工具,它能将VLX文件转换为中间格式FAS(Fast LISP)。这个工具可以在Windows 7 64位系统上的虚拟机环境中运行,并且...