熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

繼承:重新使用接口

2013-11-23 19:07:46  來源: Java核心技術 

  就其本身來說對象的概念可為我們帶來極大的便利它在概念上允許我們將各式各樣數據和功能封裝到一起這樣便可恰當表達問題空間的概念不用刻意遵照基礎機器的表達方式在程序設計語言中這些概念則反映為具體的數據類型(使用class關鍵字)
  我們費盡心思做出一種數據類型後假如不得不又新建一種類型令其實現大致相同的功能那會是一件非常令人灰心的事情但若能利用現成的數據類型對其進行克隆再根據情況進行添加和修改情況就顯得理想多了繼承正是針對這個目標而設計的但繼承並不完全等價於克隆在繼承過程中若原始類(正式名稱叫作基礎類超類或父類)發生了變化修改過的克隆類(正式名稱叫作繼承類或者子類)也會反映出這種變化在Java語言中繼承是通過extends關鍵字實現的
  使用繼承時相當於創建了一個新類這個新類不僅包含了現有類型的所有成員(盡管private成員被隱藏起來且不能訪問)但更重要的是它復制了基礎類的接口也就是說可向基礎類的對象發送的所有消息亦可原樣發給衍生類的對象根據可以發送的消息我們能知道類的類型這意味著衍生類具有與基礎類相同的類型!為真正理解面向對象程序設計的含義首先必須認識到這種類型的等價關系
  由於基礎類和衍生類具有相同的接口所以那個接口必須進行特殊的設計也就是說對象接收到一條特定的消息後必須有一個方法能夠執行若只是簡單地繼承一個類並不做其他任何事情來自基礎類接口的方法就會直接照搬到衍生類這意味著衍生類的對象不僅有相同的類型也有同樣的行為這一後果通常是我們不願見到的
  有兩種做法可將新得的衍生類與原來的基礎類區分開第一種做法十分簡單為衍生類添加新函數(功能)這些新函數並非基礎類接口的一部分進行這種處理時一般都是意識到基礎類不能滿足我們的要求所以需要添加更多的函數這是一種最簡單最基本的繼承用法大多數時候都可完美地解決我們的問題然而事先還是要仔細調查自己的基礎類是否真的需要這些額外的函數
   改善基礎類
  盡管extends關鍵字暗示著我們要為接口擴展新功能但實情並非肯定如此為區分我們的新類第二個辦法是改變基礎類一個現有函數的行為我們將其稱作改善那個函數
  為改善一個函數只需為衍生類的函數建立一個新定義即可我們的目標是盡管使用的函數接口未變但它的新版本具有不同的表現
   等價與類似關系
  針對繼承可能會產生這樣的一個爭論繼承只能改善原基礎類的函數嗎?若答案是肯定的則衍生類型就是與基礎類完全相同的類型因為都擁有完全相同的接口這樣造成的結果就是我們完全能夠將衍生類的一個對象換成基礎類的一個對象!可將其想象成一種純替換在某種意義上這是進行繼承的一種理想方式此時我們通常認為基礎類和衍生類之間存在一種等價關系——因為我們可以理直氣壯地說圓就是一種幾何形狀為了對繼承進行測試一個辦法就是看看自己是否能把它們套入這種等價關系中看看是否有意義
  但在許多時候我們必須為衍生類型加入新的接口元素所以不僅擴展了接口也創建了一種新類型這種新類型仍可替換成基礎類型但這種替換並不是完美的因為不可在基礎類裡訪問新函數我們將其稱作類似關系新類型擁有舊類型的接口但也包含了其他函數所以不能說它們是完全等價的舉個例子來說讓我們考慮一下制冷機的情況假定我們的房間連好了用於制冷的各種控制器也就是說我們已擁有必要的接口來控制制冷現在假設機器出了故障我們把它換成一台新型的冷熱兩用空調冬天和夏天均可使用熱空調類似制冷機但能做更多的事情由於我們的房間只安裝了控制制冷的設備所以它們只限於同新機器的制冷部分打交道新機器的接口已得到了擴展但現有的系統並不知道除原始接口以外的任何東西
  認識了等價與類似的區別後再進行替換時就會有把握得多盡管大多數時候純替換已經足夠但您會發現在某些情況下仍然有明顯的理由需要在衍生類的基礎上增添新功能通過前面對這兩種情況的討論相信大家已心中有數該如何做
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26315.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.