面向對象的三個特徵及其優缺點

面向對象(OOP)三個基本特徵 - 櫻空釋 - 櫻空釋

1、封裝
      把客觀的事物封裝成抽象的類;類可以將自身的數據和方法給可信的類或者對象操作,對不可信的進行隱藏信息。
2、繼承
      可以在現有類的基礎上無需重寫,擴展類的功能.
      通過繼承創建的新類稱之爲"子類"、"派生類".    被繼承的類稱之爲"基類"、"父類"、"超類';
     
     繼承實現方式有三種:
     1)、 實現繼承是使用基類的屬性和方法而無需額外編碼;
     2)、 接口繼承是僅使用屬性和方法的名稱、但是子類必須提供實現;
     3)、 可視繼承是子窗體(類)使用基窗體(類)的外觀和實現代碼。
    使用繼承的過程中兩個類的關係是"屬於"的關係,
    抽象類僅定義將由子類創建的一般屬性和方法,創建抽象類時,使用關鍵字 Interface.
3、多態
     允許將子類類型的指針賦值給父類類型的指針。
    
     實現多態的方式:
    1)、覆蓋指子類重新定義父類的虛函數的方法。
    2)、重載指允許存在多個同名函數,而這些函數的參數表不同(或許參數個數不同,或許參數類型不同,或許兩者都不同)。
           重載的概念並不屬於“面向對象編程”,重載的實現是:編譯器根據函數不同的參數表,對同名函數的名稱進行修飾,然後這些同名函數就成了不同的函數。
    如,有兩個同名函數:function func(p:integer):integer;和function func(p:string):integer;。那麼編譯器做過修飾後的函數名稱可能是這樣的:int_func、str_func。對於這兩個函數的調用,在編譯器間就已經確定了,是靜態的。也就是說,它們的地址在編譯期就綁定了,因此,重載和多態無關!真正和多態相關的是“覆蓋”。當子類重新定義了父類的虛函數後,父類指針根據賦給它的不同的子類指針,動態(記住:是動態!)的調用屬於子類的該函數,這樣的函數調用在編譯期間是無法確定的(調用的子類的虛函數的地址無法給出)。因此,這樣的函數地址是在運行期綁定的。結論就是:重載只是一種語言特性,與多態無關,與面向對象也無關!
 

概念講解

泛化(Generalization)

o_Generalization.gif

圖表 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的功能和屬性。

 

聚合(組合)

o_aggregationBase.gif

圖表 2 組合

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

例如,眼(Eye)、鼻(Nose)、口(Mouth)、耳(Ear)是頭(Head)的一部分,所以類Head應該由類Eye、Nose、Mouth、Ear組合而成,不是派生(繼承)而成。

 

聚合的類型分爲無、共享(聚合)、複合(組合)三類。

 

聚合(aggregation)

 

o_aggregation.gif

圖表 3 共享

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

 

組合(composition)

o_composition.gif

圖表 4 複合

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

 

依賴(Dependency)

o_Dependency.gif

圖表 5 依賴

這裏B與A的關係只是一種依賴(Dependency)關係,這種關係表明,如果類A被修改,那麼類B會受到影響。



發佈了75 篇原創文章 · 獲贊 45 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章