天天看點

《C++面向對象高效程式設計(第2版)》——1.5 什麼可以作為類

本節書摘來自異步社群出版社《c++面向對象高效程式設計(第2版)》一書中的第1章,第1.5節,作者: 【美】kayshav dattatri,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

c++面向對象高效程式設計(第2版)

用簡單的例子詳細讨論類和對象非常容易,但是難點在于如何為給定的問題找出合适的類。我們必須了解類代表什麼,何時将問題中的某些部分轉化為類,而非資料,反之亦然。根據我們的定義,類擁有一組對象的共同屬性(或者特性)。怎樣的共同才是共同?何時說這是一個類,而不是另一個類的對象?這些都是我們在學習oop時會遇到的,和真正關心的問題。

當我們決定建立一個類時,第一個問題就是“是否确實需要這個類的多個執行個體?”,如果答案為“是”,那麼我們的方法就可能正确至少粗略看起來正确。如果發現類的執行個體之間沒有絕對差别(也就是說,每個執行個體和其他執行個體相同,而且它們的行為完全一緻),那麼,我們可能錯誤地建立了這個類,應該将這個類建立為一個值。例如,如果在處理鮮花問題時将color作為類,而每種顔色都可以用唯一的數字代表,那麼,将color設計成一個類就毫無意義。但是,如果我們在圖形系統中處理顔色(涉及複雜的顔色計算),則必須将color定義為類,因為基于顔色的組成(紅色、綠色和藍色),每種顔色都具有許多成分和深淺變化。更重要的是,可以通過控制color的成分來控制顔色。這說明,在圖形系統中,color不僅僅是一個值,它還包含許多依附于它的行為。

再來看看另一個例子,家庭位址(或者address)可能被看做是字元(或者值)數組。但是,address在電子郵件系統中可能是一個類,它包括域名、計算機名稱等,而且位址還反映了用于消息傳送的路由性質。很明顯,在這樣的系統中,我們不能将位址作為字元數組,它是一個真正的類。

記住,不可能一次設計就能一步到位。在第一輪設計中作為類的部分,可能在第二輪設計中改為資料,反之亦然。解決問題的方案在不斷變化,最終的解決方案很可能與最初設計截然不同。

這都源于類的重要特性。類不隻是容器,不能認為它僅僅用于存儲被函數修改的資料。類為客戶提供了複雜實體的簡化版本,并允許客戶通過操作類的對象完成有用的工作。類不隻是将它的各個部分簡單地組合起來而已。類決定如何完成任務,它清楚地陳述了該類的對象可以做什麼。回顧color的例子,如果在圖形系統中,隻有紅色、綠色和藍色,對客戶而言意義不大。color類需要完成的任務是将各種顔色成份組合起來,并為其添加值來表現這些顔色。同理,銀行賬戶不能隻包含字元和浮點數字,銀行賬戶類應該允許客戶更加友善、安全地管理他們的金錢。

繼續閱讀