OOP三個基本特徵

2021-10-24 15:21:50 字數 3151 閱讀 5161

封裝最好理解了。封裝是物件導向的特徵之一,是物件和類概念的主要特性。

封裝,也就是把客觀事物封裝成抽象的類,並且類可以把自己的資料和方法只讓可信的類或者物件操作,對不可信的進行資訊隱藏。

物件導向程式設計 (oop) 語言的乙個主要功能就是「繼承」。繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴充套件。 繼承現有類 + 擴充套件

通過繼承建立的新類稱為「子類」或「派生類」。 

被繼承的類稱為「基類」、「父類」或「超類」。 

繼承的過程,就是從一般到特殊的過程。 

要實現繼承,可以通過「繼承」(inheritance)和「組合」(composition)來實現。 

在某些 oop 語言中,乙個子類可以繼承多個基類。但是一般情況下,乙個子類只能有乙個基類,要實現多重繼承,可以通過多級繼承來實現。 

繼承概念的實現方式有三類:實現繼承、介面繼承和可視繼承。 

ø         實現繼承是指使用基類的屬性和方法而無需額外編碼的能力; 

ø         介面繼承是指僅使用屬性和方法的名稱、但是子類必須提供實現的能力; 

ø         可視繼承是指子窗體(類)使用基窗體(類)的外觀和實現**的能力。 

在考慮使用繼承時,有一點需要注意,那就是兩個類之間的關係應該是「屬於」關係。例如,employee 是乙個人,manager 也是乙個人,因此這兩個類都可以繼承 person 類。但是 leg 類卻不能繼承 person 類,因為腿並不是乙個人。 

抽象類僅定義將由子類建立的一般屬性和方法,建立抽象類時,請使用關鍵字 inte***ce 而不是 class。 

oo開發正規化大致為:劃分物件→抽象類→將類組織成為層次化結構(繼承和合成) →用類與例項進行設計和實現幾個階段。 

多型性(polymorphisn)是允許你將父物件設定成為和乙個或更多的他的子物件相等的技術,賦值之後,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作。簡單的說,就是一句話:允許將子類型別的指標賦值給父類型別的指標。 

實現多型,有二種方式,覆蓋,過載。 

覆蓋,是指子類重新定義父類的虛函式的做法。 

過載,是指允許存在多個同名函式,而這些函式的參數列不同(或許引數個數不同,或許引數型別不同,或許兩者都不同)。 

其實,過載的概念並不屬於「物件導向程式設計」,過載的實現是:編譯器根據函式不同的參數列,對同名函式的名稱做修飾,然後這些同名函式就成了不同的函式(至少對於編譯器來說是這樣的)。如,有兩個同名函式:function func(p:integer):integer;和function func(p:string):integer;。那麼編譯器做過修飾後的函式名稱可能是這樣的:int_func、str_func。對於這兩個函式的呼叫,在編譯器間就已經確定了,是靜態的(記住:是靜態)。也就是說,它們的位址在編譯期就繫結了(早繫結),因此,過載和多型無關!真正和多型相關的是「覆蓋」。當子類重新定義了父類的虛函式後,父類指標根據賦給它的不同的子類指標,動態(記住:是動態!)的呼叫屬於子類的該函式,這樣的函式呼叫在編譯期間是無法確定的(呼叫的子類的虛函式的位址無法給出)。因此,這樣的函式位址是在執行期繫結的(晚邦定)。結論就是:過載只是一種語言特性,與多型無關,與物件導向也無關!引用一句bruce eckel的話:「不要犯傻,如果它不是晚邦定,它就不是多型。」

那麼,多型的作用是什麼呢?我們知道,封裝可以隱藏實現細節,使得**模組化;繼承可以擴充套件已存在的**模組(類);它們的目的都是為了——**重用。而多型則是為了實現另乙個目的——介面重用!多型的作用,就是為了類在繼承和派生的時候,保證使用「家譜」中任一類的例項的某一屬性時的正確呼叫。

過載:編譯期確定      多型:執行期才確定(晚繫結)

泛化(generalization)

圖表 1 泛化

teacher , student, guest  is「a kind of」 person

在上圖中,空心的三角表示繼承關係(類繼承),在uml的術語中,這種關係被稱為泛化(generalization)。person(人)是基類,teacher(教師)、student(學生)、guest(來賓)是子類。 

若在邏輯上b是a的「一種」,並且a的所有功能和屬性對b而言都有意義,則允許b繼承a的功能和屬性。 

例如,教師是人,teacher 是person的「一種」(a kind of )。那麼類teacher可以從類person派生(繼承)。 

如果a是基類,b是a的派生類,那麼b將繼承a的資料和函式。 

若在邏輯上b是a的「一種」(a kind of ),則允許b繼承a的功能和屬性。 

聚合(組合)

圖表 2 組合 

若在邏輯上a是b的「一部分」(a part of),則不允許b從a派生,而是要用a和其它東西組合出b。 

例如,眼(eye)、鼻(nose)、口(mouth)、耳(ear)是頭(head)的一部分,所以類head應該由類eye、nose、mouth、ear組合而成,不是派生(繼承)而成。 

聚合的型別分為無、共享(聚合)、復合(組合)三類。 

聚合(aggregation) 

圖表 3 共享 

上面圖中,有乙個菱形(空心)表示聚合(aggregation)(聚合型別為共享),聚合的意義表示has-a關係。聚合是一種相對鬆散的關係,聚合類b不需要對被聚合的類a負責。 

組合(composition) 

圖表 4 復合 

這幅圖與上面的唯一區別是菱形為實心的,它代表了一種更為堅固的關係——組合(composition)(聚合型別為復合)。組合表示的關係也是has-a,不過在這裡,a的生命期受b控制。即a會隨著b的建立而建立,隨b的消亡而消亡。 

依賴(dependency)

圖表 5 依賴 

這裡b與a的關係只是一種依賴(dependency)關係,這種關係表明,如果類a被修改,那麼類b會受到影響。

override 與 overload 

override 重寫與覆蓋含義一樣,角度不同

物件導向OOP的三個基本特徵

摘要總結 封裝 封裝就是要把屬於同一類事物的共性 包括屬性與行為 歸到乙個類中 繼承 有些事物有共性,但還存在區別 多型 對這件抽象的事,對於每個個體 具體 又能找到其自身的行為去執行 封裝 首先,屬性可用來描述同一類事物的特徵,行為可描述一類事物可做的操作,封裝就是要把屬於同一類事物的共性 包括屬...

物件導向三個基本特徵

封裝 將客觀事物抽象成類,每個類對自身的資料和方法通過各種許可權進行管理保護 繼承 實現繼承 使用基類的屬性與方法而無需額外編碼 可視繼承 了窗體使用父窗體的外觀和實現 介面繼承 僅使用屬性和方法,實現滯後到子類實現 前兩種是類繼承,後一種利用純虛函式。多型 將父物件設定成為乙個或多個更多的它的子物...

物件導向的三個基本特徵 物件導向基本特徵

物件導向的三個基本特徵 封裝是物件和類概念的主要特徵,就是把客觀的封裝起來,只對外暴露出來,並把自己的資料和方法只讓可信的類或物件操作作用 隱藏實現細節,使得 模組化 使用現有類的所有功能,並且無需重新編寫原來的類中的方法對這些功能的擴充套件,oc只能實現單繼承,如果想要實現多繼承的話可以通過分類或...