針對介面編程,而不是針對實現編程 __編程

來源:互聯網
上載者:User
針對介面編程,而不是針對實現編程  
   
  在物件導向設計方法中有很多值得提倡的方法,這些方法可以為我們的設計帶來很大的靈活性,可複用性。其中一個原則就是“針對介面編程,而不是針對實現編程”  
  這個原則帶來的好處有以下幾點:  
    Client不必知道其使用對象的具體所屬類。  
    Client無需知道特定類,只需知道他們所期望的介面。  
    一個對象可以很容易地被(實現了相同介面的)的另一個對象所替換。  
    對象間的串連不必硬綁定(hardwire)到一個具體類的對象上,因此增加了靈活性。  
    鬆散藕合(loosens   coupling)。  
    增加了重用的可能性。提高了(對象)組合的機率,因為被包含對象可以是任何實現了一個指定介面的類。  
  在實現上:  
  C++通過繼承純虛類來實現介面繼承。  
  Java對介面繼承具有單獨的語言構造方式-Java介面。  
   
  但從辯證法的角度看,事物總有利有弊。“針對介面編程”有如上諸多好處,確不可避免的帶來設計的複雜性。特別對於沒有豐富經驗的設計人員。  
  其中令我比較困惑的地方是:  
  要想針對介面編程,就必然要最大化介面類,使包括所有子類的方法,這樣我們才能利用多態性用介面類來一致的操作子類。但這會帶來以下幾點不足。  
    違反面各對象的另一個原則,這個原則是:一個類只能定義那些對它的子類有意義的操作。  
    介面類包括了並不是對每一個子類都有意義的方法,使介面類臃腫,難以理解。  
    從父類繼承的無用方法,如何處理。  
   
  舉個例子來說。我們要實現這樣一個功能模組。一個TreeView上有各種節點。我們對這樣的一個Tree   的節點操作。比如複製,剪下,粘貼,重新命名,查看屬性、設定它的表徵圖,添加到樹節點上等等。每種節點的相同操作(比如複製)的實現是不同的。  
  你會怎麼設計它:  
  在C++中我會這樣做。  
  我會將每種結點實現成一個類。以實現各自的相關操作(比如複製,粘貼),這些類都繼承至一個純虛的父類,在這個父類中以虛方法的方式聲名子類實現我的相關方法,這樣做的好處是當你從Tree中取出一個節點時,你不必關心這個節點是什麼類實現的,你只需要以純虛的父類指標操作它就可以了,這樣就實現了介面繼承的所帶來的優點。  
  但是,如果並不是每個節點都支援所有的方法,比如有些節點不允許複製,有些節點不允許重新命名等,那麼從父類繼承的聲名如何處理,實現成一個空方法麼。還是不將這樣的方法放到父類中。如果不放到父類中,就沒辦法以統一的方法操作所有的子類了。   
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.