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

15 篇文章 0 订阅

对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原则,因为派生类的方法前置条件比基类更加严格了。 

参考:基于契约的设计

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值