1. 程式人生 > >面向物件的原則之替換原則

面向物件的原則之替換原則

替換原則

  替換原則由MIT電腦科學實驗室的Liskov女士在1987年的OOPSLA大會上的一篇文章《Data Abstraction and Hierarchy》中提出,主要闡述有關繼承的一些原則,故又稱里氏替換原則。

  2002年,Robert C.Martin出版了一本名為《Agile Software Development Principles Patterns and Practices》的書,在書中他把里氏代換原則最終簡化為一句話:“Subtypes must be substitutable for their base types”。(子類必須能夠替換成它們的基類。)

LSP的內容

  里氏替換原則(Liskov Substitution Principle,LSP)的定義和主要的思想如下:由於面向物件程式設計技術中的繼承在具體的程式設計中過於簡單,在許多系統的設計和程式設計實現中,我們並沒有認真地、理性地思考應用系統中各個類之間的繼承關係是否合適,派生類是否能正確地對其基類中的某些方法進行重寫等問題。因此經常出現濫用繼承或者錯誤地進行了繼承等現象,給系統的後期維護帶來不少麻煩。這就需要我們有一個設計原則來遵循,它就是替換原則。

  LSP指出:子型別必須能夠替換掉它們的父型別、並出現在父類能夠出現的任何地方。它指導我們如何正確地進行繼承與派生,併合理地重用程式碼。此原則認為,一個軟體實體如果使用一個基類的話,那麼一定適用於其子類,而且這根本不能察覺出基類物件和子類物件的區別。

LSP主要是針對繼承的設計原則

  因為繼承與派生是OOP的一個主要特性,能夠減少程式碼的重複程式設計實現,從而實現系統中的程式碼複用,但如何正確地進行繼承設計和合理地應用繼承機制呢?

  這就是LSP所要解決的問題:

  如何正確地進行繼承方面的設計?

  最佳的繼承層次如何獲得?

  怎樣避免所設計的類層次陷入不符合OCP原則的狀況?

  那如何遵守該設計原則呢?

  父類的方法都要在子類中實現或者重寫,並且派生類只實現其抽象類中宣告的方法,而不應當給出多餘的方法定義或實現。

  在客戶端程式中只應該使用父類物件而不應當直接使用子類物件,這樣可以實現執行期繫結(動態多型)。

  如果A、B兩個類違反了LSP的設計,通常的做法是建立一個新的抽象類C,作為兩個具體類的超類,將A和B的共同行為移動到C中,從而解決A和B行為不完全一致的問題。

  PHP對LSP的支援並不好,缺乏向上轉型等概念,只能通過一些曲折的方法實現。對於這個原則,這裡就不再細講了。

相關推薦

面向物件原則替換原則

替換原則   替換原則由MIT電腦科學實驗室的Liskov女士在1987年的OOPSLA大會上的一篇文章《Data Abstraction and Hierarchy》中提出,主要闡述有關繼承的一些原則,故又稱里氏替換原則。   2002年,Robert C

面向物件的五大設計原則里氏替換原則

里氏替換原則(liskov substitution principle,簡稱LSP)的核心只有一句話,subtypes must be substitutable for their base types(子類必須能夠替換成它們的基類),關於它的定義和主要的思想如下: 由於面向物件程式設計

面向物件的五大設計原則依賴倒置原則

依賴倒置原則(depend ence inversion principle,簡稱DIP),簡單來說就是將依賴關係倒置為依賴介面,具體就是,上層模組不應該依賴於下層模組,它們共同依賴於一個抽象(父類不能依賴子類,應該共同依賴於抽象類)。抽象不能依賴於具體,但是具體應該依賴於抽象,我們要注意下,咱

面向物件的五大設計原則開放封閉原則

隨著我們軟體系統的規模不斷的增大,軟體系統的維護和修改的複雜性不斷地增加,在這種情況下,法國工程院院士bertrand meyer在1998年提出了開放封閉原則(open close principle,簡稱OCP),它的基本思想就是,open(open for exception)模組的行為,

面向物件的五大設計原則介面隔離原則

通過上篇文章,我們已經對於五大設計原則的單一職責原則有了一定的瞭解,接下來我們就來看下第二種設計原則,介面隔離原則,廢話不多說啊,來仔細看。 我們在設計程式的時候,如果一個模組包含多個子模組,那麼我們應該小心的對該模組做出抽象,假設該模組由一個類來實現,我們就可以把系統抽象成一個介面,但是要

面向物件的五大設計原則單一職責原則

我們都知道,面向物件是一種高度抽象的思維,我們在面向物件設計中,類是最基本的單位,我們的各種設計都是圍繞著類來進行的,可以這麼說,類與類之間的關係,構成了設計模式的大部分內容,我麼可能認為,類是屬性+函式構成的,事實上在底層儲存上確實也是這麼來搞的,但是這些僅僅只是確定一個獨立的類,而類與類之間

面向物件設計開放-封閉原則(Open

開放-封閉原則: 對擴充套件開放,對修改關閉,既軟體實體應儘量在不修改原始碼的情況下進行擴充套件 。  好處: 高內聚,低耦合。 降低了各程式之間的耦合性,抽象化設計是開閉原則的關鍵。

面向物件六大原則----里氏替換原則,依賴倒置原則

單一職責原則 英文名稱是Single Responsibility Principle,簡稱SRP 開閉原則英文全稱是Open Close Principle,簡稱OCP 里氏替換原則 英文全稱是Liskov Substitution Principle,簡稱LSP 依賴倒置原則 英文全稱是Depe

面向物件設計原則--里氏替換原則(LSP)和依賴倒置原則(DIP)

面向物件設計原則–里氏替換原則(LSP)和依賴倒置原則(DIP) tags:設計模式 LSP–inheritance should ensure that any property prove

[面向物件六大原則] 里氏替換原則(LSP)

里氏替換原則 - Liskov Substitution Principle定義一:如果對每一個型別為S的物件O1,都有型別為T的物件O2,使得以T定義的所有程式P在所有的物件O1都替換成O2時,程式P的行為沒有發生變化,那麼型別S是型別T的子型別。定義二:所有引用基類的地方

面向物件程式設計的五大原則例子分析

在應用開發的過程中,感覺最快樂也是最痛苦的莫過於優化、重構程式碼。在版本不斷地迭代更新上線中,我們不但要保證功能能正常執行,而且我們的程式碼需要保證健壯性、穩定性、拓展性。然而在我們不斷接受新的知識過程中,我們對程式碼的理解也會越來越深刻,從而出現了優化,甚至是重構程式碼的過程。在此之前

面向物件三大特性五大原則 + 低耦合高內聚

面向物件的三大特性是"封裝、"多型"、"繼承",五大原則是"單一職責原則"、"開放封閉原則"、"里氏替換原則"、"依賴倒置原則"、"介面分離原則"。 什麼是面向物件 面向物件(Object Oriented,OO)是軟體開發方法。面向物件的概念和應用已超越了程式

面向物件程式的設計原則

1. 單一職責原則(SRP):就一個類而言,應該僅有一個引起它變化的原因。 由此可以推匯出:一個函式甚至一個變數僅表示一個含義,不能表示多餘一個的含義,否則就會在使用過程中出現歧義。 如果一個類承擔的職責過多,就等於把這些職責耦合在一起了。一個職責的變化可能會削弱這個類完成其他職

面向物件設計與開發原則

介紹 這裡介紹了5個面向物件設計與開發原則–SOLID原則,分別是:單一職責原則、開放封閉原則、里氏替換原則、介面隔離原則、依賴倒置原則。另外還介紹了其他3個原則:迪米特法則、"Tell, Don’t ask"原則、單一抽象層次原則。在面向物件的程式設計和開發過程中時,這些原則非常重要,

Android設計模式學習筆記第一章-----面向物件的6大原則

一、單一職責原則 說明:每一個類中的屬性及方法都具有與這個類強相關的特點。如需要構建一個影象快取的功能,根據UML圖完成設計,則需要構建一個影象快取的類ImageCache,和一個影象載入的類ImageLoad。如果把這兩個類的功能共同放到影象快取類ImageCache中,

php面向物件程式設計5大原則+6大設計模式

一、面向物件程式設計的6大設計原則 單一職責原則——類要職責單一,一個類只需要做好一件事情。 里氏替換原則——子類可以擴充套件父類的功能,但不能改變父類原有的功能(可以實現父類的抽象方法和增加自己特有的方法,不要覆蓋父類的非抽象方法)。 依賴倒置原則——-面向介面程式設計:只

學習Java程式設計面向物件的五大基本原則

Java 是面向物件的高階程式語言,類和物件是 Java 程式的構成核心。圍繞著 Java 類和 Java 物件,有三大基本特性:封裝是 Java 類的編寫規範、繼承是類與類之間聯絡的一種形式、而多型為系統元件或模組之間解耦提供瞭解決方案。 單一職責原則(Single-Resposibility

C#面向物件設計的七大原則

本文我們要談的七大原則,即:單一職責,里氏替換,迪米特法則,依賴倒轉,介面隔離,合成/聚合原則,開放-封閉 。 1.   開閉原則(Open-Closed Principle, OCP) 定義:軟體實體應當對擴充套件開放,對修改關閉。這句話說得有點專業,更通俗一點講,也就是

面向物件程式設計的特徵,原則

OOP:(Object Oriented Programming),面向物件的程式設計。所謂“物件”在顯式支援面向物件的語言中,一般是指類在記憶體中裝載的例項,具有相關的成員變數和成員函式(也稱為:方法)。 OOP 達到了軟體工程的三個主要目標:重用性、靈活性和擴充套件性。 特徵一 

【JAVA】面向物件設計七個原則

    程式設計編碼理論上只要跑得起來就沒有問題了,但實際上程式是為需求服務的,需求無時無刻都有可能變更,程式也需要做出相應改變,這時如果程式設計混亂,那麼大多數時候都是沒有辦法輕微改動程式就達到需求目標的,而此時給程式大開刀也不允許,最後進入了兩難境地。所以最好一開始就