物件導向程式設計的三要素是封裝、繼承、多型態。封裝就是事物抽象化為類,把對外介面暴露,將實現和內部資料隱藏;繼承是指可以使用現有類別的所有功能;多態性是指允許將父物件設定成為和一個或更多子物件相等的技術。
物件導向程式設計的三要素是封裝、繼承、多態
物件導向的五個基本原則:單一職責原則、開放封閉原則、Liskov替換原則、依賴倒置原則、介面抽象原則
#封裝
封裝就是事物抽象化為類別,把對外介面暴露,將實現和內部數據隱藏。
繼承
物件導向程式設計 (OOP) 語言的一個主要功能就是「繼承」。繼承是指這樣一種能力:它可以使用現有類別的所有功能,並在無需重新編寫原始的類別的情況下對這些功能進行擴展。
透過繼承創建的新類別稱為「子類別」或「衍生類別」。
被繼承的類別稱為「基底類別」、「父類別」或「超類別」。
繼承的過程,就是從一般到特殊的過程。
要實現繼承,可以透過「繼承」(Inheritance)和「組合」(Composition)來實現。
在某些 OOP 語言中,一個子類別可以繼承多個基底類別。但是一般情況下,一個子類別只能有一個基底類,要實現多重繼承,可以透過多層繼承來實現。
繼承概念的實作方式有三類:實作繼承、介面繼承、視覺繼承。
實作繼承是指使用基底類別的屬性和方法而無需額外編碼的能力;
介面繼承是指僅使用屬性和方法的名稱、但是子類別必須提供實作的能力;
視覺繼承是指子窗體(類別)使用基底窗體(類別)的外觀和實作程式碼的能力。
在考慮使用繼承時,有一點要注意,那就是兩個類別之間的關係應該是「屬於」關係。例如,Employee 是一個人,Manager 也是一個人,因此這兩個類別都可以繼承 Person 類別。但是 Leg 類別卻不能繼承 Person 類,因為腿不是一個人。
抽象類別只定義將子類別建立的一般屬性和方法,在建立抽象類別時,請使用關鍵字 Interface 而不是 Class。
OO開發範式大致為:劃分物件→抽象類別→將類別組織成為層次化結構(繼承與合成) →用類別與實例進行設計和實作幾個階段。
多態
多態性(polymorphisn)是允許你將父物件設定為和一個或更多的他的子物件相等的技術,賦值之後,父物件就可以根據目前賦值給它的子物件的特性以不同的方式運作。簡單的說,就是一句話:允許將子類別類型的指標賦值給父類別類型的指標。
實作多態,有二種方式,覆蓋,重載。
覆蓋,是指子類別重新定義父類別的虛擬函數的做法。
重載,是指允許存在多個同名函數,而這些函數的參數表不同(或許參數個數不同,或許參數類型不同,或許兩者都不同)。
其實,重載的概念並不屬於“物件導向程式設計”,重載的實作是:編譯器根據函數不同的參數表,對同名函數的名稱做修飾,然後這些同名函數就成了不同的函數(至少對於編譯器來說是這樣的)。
如,有兩個同名函數:function func(p:integer):integer;和function func(p:string):integer;。那麼編譯器做過修飾後的函式名稱可能是這樣的:int_func、str_func。
對於這兩個函數的調用,在編譯器間就已經確定了,是靜態的(記住:是靜態)。也就是說,它們的位址在編譯期就綁定了(早期綁定),因此,重載和多態無關!真正和多態相關的是「覆蓋」。
當子類別重新定義了父類別的虛擬函數後,父類別指標根據賦給它的不同的子類別指針,動態(記住:是動態!)的呼叫屬於子類別的該函數,這樣的函數呼叫在編譯期間是無法確定的(所呼叫的子類別的虛擬函數的位址無法給出)。
因此,這樣的函數位址是在運行期間綁定的(晚邦定)。結論就是:重載只是一種語言特性,與多態無關,與物件導向也無關!引用一句Bruce Eckel的話:「不要犯傻,如果它不是晚邦定,它就不是多態。」
那麼,多態的作用是什麼呢?我們知道,封裝可以隱藏實作細節,使得程式碼模組化;繼承可以擴展已存在的程式碼模組(類別);
它們的目的都是為了——程式碼重用。而多態則是為了實現另一個目的-介面重用!多態的作用,就是為了類別在繼承衍生的時候,保證使用「家譜」中任一類別的實例的某一屬性時的正確呼叫。
更多相關知識,請造訪 PHP中文網! !
以上是物件導向程式設計的三要素是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!