物件組合與委託

2021-04-08 23:36:11 字數 1369 閱讀 6419

在討論這個話題之前,我想先來談談我的一段經歷:我是乙個今年剛畢業的應屆畢業生。相信大家都知道乙個應屆畢業生都會碰到的問題是落戶問題,我們的戶口需要從學校 所在地轉到現在工作的地方。但是,一般來說,單位是沒有權利來保管乙個員工的人事檔案的,我們需要將檔案存放到當地人事局的乙個下屬機構(比如我現在是要將檔案存放到杭州是人事局下屬的杭州市人才開發中心)。在杭州市人才開發中心有乙個人事**這樣乙個業務,我們可以拿著 所在工作的公司的乙份人事委託書 到人才開發中心的人事**視窗便可以存放檔案的手續了,這樣我們便 可以將我們的檔案存放在人才開發中心的檔案庫里了。

在這裡我 羅里羅嗦地舉了上面的這樣的乙個例子,主要是為了談談我對委託的理解:公司沒辦法做存放檔案這樣一件事,而且也不準備也沒有必要來做一件可以有人事部門來完成的工作,因為他們知道他們只要將這件事委託給杭州市人才開發中心或者其他的人事局的下屬部門便可以完成了,而且也根本沒有必要知道這些事情到底是怎麼樣來完成的。這就是我們生活當中的委託,從生活中的例子來理解軟體開發中的委託,相信回更容易些。

以上舉了乙個生活中委託的例子,對於物件組合這個概念,本人一時還沒有想到乙個比較貼切的例子,等以後想到了再加吧。:)。下面我們從物件導向程式設計這個角度來看看物件組合到底是怎麼回事吧 :相信熟悉物件導向設計的朋友都回知道有這樣的一條設計原則:「優先使用物件組合,而不是類繼承」。其實類繼承和物件組合都是物件導向系統中功能復用的最常用的方法,前者是通過生成子類的方法來實現,後者是通過物件組合來獲得。至於二者的區別不是本文討論的要點,下面我們主要具體看看物件組合。

物件組合是通過獲得對其他物件的引用而在執行時刻動態定義的。具體的說是乙個解決方法通過繼承抽象類或介面,在執行的時候才決定具體是呼叫哪個物件。這裡我們不會想類繼承一樣破壞父類的封裝性,同時因為物件的實現是基於介面的,所以實現上存在較少的依賴性。

講了大半天的委託和物件組合,現在我們再來看看物件組合和委託到底存在乙個什麼樣的關係。其實委託用的就是物件組合的方法,它使組合具有與繼承同樣的復用功能,在委託方式下,有兩個物件參與處理乙個請求接收請求的物件將操作委託給他的**者。這類似與子類將他的請求交給他的父類來處理。

下面舉乙個例子來說明一下這個問題:(視窗類將他的area方法操作委託給乙個矩形例項)

上面window指向rectangle的箭頭表示乙個類對另乙個類例項的引用關係,這裡我需要得到乙個area()的值,只有在執行階段才動態的決定是返回乙個rectangle還是circle的area()

上面的這個例子比較具體的說明了如何通過物件組合的方式來達到物件導向系統功能復用的目的。當然我們還可以通過window類來繼承rectangle類的方法來實現得到乙個矩形面積的目的,但這種方法無論是從擴充套件性還是靈活性的角度上看都是不合理的。

後記:本文是鄙人在最近學習物件導向和設計模式過程中(特別是學習《設計模式》這本書過程中)的乙個小結,可能很地方表達是不過確切的,全當是一篇自己的讀書筆記了。

物件導向 (10)委託與事件

委託是對函式的封裝,可以當做給方法的特徵制定乙個名稱。而事件則是委託的一種特殊形式,當發生有意義的事情時,事件物件處理通知過程。委託是一種引用方法的型別。一旦為委託分配了方法,委託將與該方法具有完全相同的行為。委託物件用關鍵字delegate來宣告。而事件是說在發生其他類或物件關注的事情時,類或物件...

類與物件之組合

第二大題 基於圓形類實現乙個圓環類,要求接收引數 外圓半徑和內圓半徑 完成方法 計算環形面積和環形周長 公式自己上網查 radius半徑 acreage面積 要求,借助組合,要求組合圓形類的物件完成需求 circular ring圓環 perimeter周長 from math import pi ...

物件導向 委託

概念 類似方法在記憶體中的首位址,但是它是型別安全的,明確知道方法的返回值型別和引數。可以這樣理解 對方法的乙個間接呼叫。定義了委託相當於定義了乙個類。格式 訪問修飾符 關鍵字 delegate 所指向方法的返回型別 委託的名字 形參 使用方式 委託的名字 委託物件 關鍵字 new 委託的名字 所指...