天天看點

面向對象的三個基本特征(講解)面向對象的三個基本特征(講解)

面向對象的三個基本特征(講解)

面向對象的三個基本特征是:封裝、繼承、多态。

面向對象的三個基本特征(講解)面向對象的三個基本特征(講解)

封裝

封裝最好了解了。封裝是面向對象的特征之一,是對象和類概念的主要特性。

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

繼承

面向對象程式設計 (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的話:“不要犯傻,如果它不是晚邦定,它就不是多态。”

那麼,多态的作用是什麼呢?我們知道,封裝可以隐藏實作細節,使得代碼子產品化;繼承可以擴充已存在的代碼子產品(類);它們的目的都是為了——代碼重用。而多态則是為了實作另一個目的——接口重用!多态的作用,就是為了類在繼承和派生的時候,保證使用“家譜”中任一類的執行個體的某一屬性時的正确調用。

概念講解

泛化(Generalization)

面向對象的三個基本特征(講解)面向對象的三個基本特征(講解)

圖表 1泛化

在上圖中,空心的三角表示繼承關系(類繼承),在UML的術語中,這種關系被稱為泛化(Generalization)。Person(人)是基類,Teacher(教師)、Student(學生)、Guest(來賓)是子類。

若在邏輯上B是A的“一種”,并且A的所有功能和屬性對B而言都有意義,則允許B繼承A的功能和屬性。

例如,教師是人,Teacher 是Person的“一種”(a kind of )。那麼類Teacher可以從類Person派生(繼承)。

如果A是基類,B是A的派生類,那麼B将繼承A的資料和函數。

如果類A和類B毫不相關,不可以為了使B的功能更多些而讓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會受到影響。

繼續閱讀