封裝是oo的重要特徵,這一點是毫無疑問的,至於算不算的上是oo的三大特徵之一(另外兩個是繼承、多型),目前仍有爭論,我也不想在這個問題上作過多的糾纏。
什麼是封裝呢?封裝是一項將低層次的元素組合起來形成新的,高層次實體的技術。被封裝的元素隱藏了它們的實現細節。封裝是人們對現實世界中解決問題時,為了進行簡化問題,對研究的物件所採用的一種方法,一種資訊遮蔽技術。例如:打**的時候,我們只需簡單的按幾個按鈕就可以了,我們沒有必要去了解**內部的線路、網路的連線,這樣一來通過對實現細節的封裝,就使得本身很複雜的問題變得非常簡單,容易操作,並且出錯的機率大大減小。
封裝的主要目的就是達到介面和實現的分離。通過封裝,對內我們將實現細節隱藏起來,對外我們則通過介面向客戶提供相應的服務。將介面和實現分離是避免所謂的「漣漪現象」的關鍵(漣漪現象,即「一石激起千層浪」。在軟體開發過程中,經常會出現為了某個目的,修改乙個檔案a,結果必須修改與之相關的其他檔案b、c,修改檔案b、c就要修改相關的檔案d、e、f、g,如此迴圈往復,就會造成大規模的修改,最終會以瀑布式擴散到系統的各個地方。就象在湖**投下了一顆石子,造成整個湖面的波動,「漣漪現象」由此而得名)。
將介面和實現分離是軟體重複使用的乙個手段,其作用主要體現在以下4個方面:
1、降低了系統內部各個模組之間的耦合,使系統更有彈性。
2、將軟體中的bug精確定位到較小的模組,有助於軟體的除錯工作。
3、降低系統的複雜性,使客戶更易理解和使用。
4、分離造成的簡單性,更有助於軟體的重複使用。
抽象是物件的最簡化的介面,他向客戶提供了所期望的服務。理解抽象的關鍵,在於介面,抽象是物件介面的抽象,對於特定的物件,抽象就是乙個明確的介面,對於**,按鈕就是他的介面(抽象)。
用好抽象的關鍵在於對所研究問題的深刻理解。設計的比較好的抽象可以把說明從實現中分離出來,通過提供必備的資訊,隱藏起實現的細節,讓客戶以較為安全和客**的方式使用物件,同時通過降低複雜性,以簡單介面的方式降低學習難度,提高學習效率。
好的抽象,應該使客戶打消「**」的念頭(不過總是有些人想方設法去窺視具體的實現),按照抽象程式設計,使得最終的客戶**更加的簡單、安全和穩定,在這方面,標準程式庫和各種準標準程式庫做得最為出色。
乙個好的抽象必須提供明確的、完整的、易於理解的說明,依賴抽象程式設計,實際上就是依賴這些說明進行程式設計,他比依賴實現程式設計有很大的優勢:
1、閱讀說明比閱讀源**容易得多,時間節省了很多,也更容易理解。
2、通過說明的完整性(例如先置條件、後置條件、適用範圍等),我們可以很清楚的了解乙個類的完整性。
3、通過說明,我們的介面具有更大的彈性和可擴充套件性(例如我們可以採用更加有效的方法實現sort介面)。
4、規定介面必須有說明,把那些沒有相應說明的介面定義為錯誤,使得類的維護更加容易。
乙個好的說明應該是規定介面必須提供的服務,必須完成的任務,而不是已經做過的事情。
封裝與抽象是密不可分的。
封裝通過提供抽象,隱藏了實現的細節,通知客戶那些是可以隨便使用的穩定的服務,那些是隨著版本的更新有可能發生變動的細節,例如有乙個介面:void sort();通過介面的說明,客戶可以知道這個介面用來進行排序,具體的排序方法是什麼,客戶無需關心,可能在版本1中,採用的是氣泡排序,在公升級的版本2中,採用的則是快速排序。客戶既然不用關心細節,那麼使用什麼方法對客戶的**不會帶來任何影響。對於乙個已經公布的介面/抽象,我們不能夠隨意更改,例如在版本1中提供了sort介面,那麼在公升級的版本2中必然也要有這個介面,因為版本公布之後,我們就無法知道,這個介面是不是有人在使用,如果我們在版本2中禁止了sort介面,那麼所以使用版本1的客戶**無法公升級,若強行公升級,勢必帶來客戶**的中斷,這個特點在com中尤為明顯。
抽象與封裝
抽象方法 抽象方法,是指沒有方法體的方法,同時抽象方法還必須使用關鍵字abstract做修飾。有抽象方法的類就是抽象類,抽象類要使用abstract關鍵字宣告。定義乙個抽象類 abstract class a public abstract void print 抽象方法,沒有方法體,有abstra...
抽象與封裝區別 轉
抽象 處理大而複雜的問題的重要手段是抽象,強調事物本質的東西。對程式抽象而言,乙個語言結構的抽象強調的是該結構外部可觀察的行為,與該結構的內部實現無關。抽象包括過程抽象和資料抽象。封裝封裝是把乙個語言結構的具體實現細節作為乙個黑匣子對該結構的使用者隱藏起來的一種機制,從而符合資訊隱藏原則。封裝包括過...
c 類(1 抽象與封裝)
類是一種抽象資料型別,宣告形式如下 class classname 類成員訪問控制 class classname 在關鍵字pubkic後面宣告,它們時類與外部的介面,任何類內,類外函式都可以訪問公用資料和函式。在關鍵字private後面宣告,只允許類中的函式訪問,而類外的函式都不能訪問。修飾訪問屬...