一個簡單的樣本揭秘LSP原則真諦

來源:互聯網
上載者:User

對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 {@Overridepublic void lspViolate(String s1, String s2) {assert s1 != null;super.lspViolate(s1, s2);}@Overridepublic 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 */@Testpublic void testLspViolate() {Client client = new Client();Base base = new Base();Base derived = new Derived();client.lspViolate(base);// 當用衍生類別對象替換基類對象時,發生AssertError 說明違反了LSP原則,因為衍生類別的方法前置條件比基類更加嚴格了client.lspViolate(derived);}/** * 測試遵循LSP */@Testpublic void testLspFollow() {Client client = new Client();Base base = new Base();Base derived = new Derived();client.lspFollow(base);client.lspFollow(derived);}}

從測試代碼 testLspViolate看出,當用衍生類別對象替換基類對象時,發生AssertError 說明違反了LSP原則,因為衍生類別的方法前置條件比基類更加嚴格了。

參考:基於契約的設計

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.