程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 關於抽象類和接口

關於抽象類和接口

編輯:.NET實例教程
長時間以來一直看到網上有斷有人在討論在面向對象設計中,抽象類和接口都可以作為“契約”的聲明方式,可以被派生類 重寫/實現,那麼為什麼在大多數的面向對象的語言中都同時保留了這兩種類型呢,另外在什麼樣的情況下該使用哪種類型更好,更能體現設計人的真正思想呢?

      在學C#的過程中,逐漸接觸到了面向對象設計,我曾經對這個問題感到很迷惑,如果除了語言上限制的類的單繼承和抽象類可以有部分實現這兩點外——當然,這也是區分使用接口還是抽象類的一個條件,但只是次要的條件——那個時候還真區分不了兩個有什麼區別。只能從語言的定義上得到一些粗淺的認識

        那個時候只是記得抽象類裡可以有成員變量,可以有具體的方法實現,可以繼承自另一個類,可以有私有成員,實現別的接口,一般類能做的事情,抽象類都可以實現;而接口只能有聲明,如 方法,事件,屬性(property)的聲明,而且只能是公開的聲明,接口也可以繼承其它的接口,而且一次還可以繼承一個或多個接口。兩者的相同點都是不能被實例化,而且采用兩種類型寫出的代碼很多情況下都符合面向對象的原則。例如遙控器我們既可以用RemoteControl作為抽象基類,也可以用IRemoteControlable作為接口來實現。也許那個時候對面向對象的理解還是剛剛入門,只是停留在表面現象吧,沒有看到這兩種方式剛好代表了設計者兩種不同的側重點,也就是說從設計上來講是完全不同的思想。這個是僅僅從編程語言本身去摳類型之間的語法上的不同是完全不一樣的。

        後來,隨著時間的增加,看的這方面的書多了,看過和編寫過的代碼也多了,在腦子裡潛意識的對這個問題逐漸有了新的認識,只是沒有想到歸納總結一下,前幾天在網上偶然看到別人的面試題有提到這個,才想到自己是不是也需要再回過頭來重新認識一下抽象類和接口兩種類型。

       先來說說抽象類,抽象類從本質上來說還是一個類,是現實中一系列有相同特性的對象的一個抽象,代表了"Is a ...."。抽象類用於部分實現一個類,再由用戶按需求對其進行不同的擴展和完善;抽象類在組件的所有實現間提供通用的已實現功能;抽象類主要用於關系密切的對象,如 shape、rectangle、triangle、square;從量級上來講,抽象類主要用於設計大的功能單元;

       接口從本質上來講是一種行為或特征上的契約,一個接口代表了一組行為的集合,一組特征上的集合,代表了“Can do....", "Is like ..."。接口只是定義一個行為的規范或規定;接口創建在大范圍全異對象間使用的功能,具有該接口的類型互相間沒有任何聯系,但都具有相同的功能或特征;接口適合為不相關的類提供通用功能;接口用於設計小而簡練的功能塊;

        以前面的RemoteControl抽象類和IRemoteControlable接口為例,該接口和抽象類裡面都可以有OpenTV、CloseTV,ChangeChannel等功能,一個電視遙控器可以有這樣的功能,一個帶遙控功能的對講機也可以有這樣的功能,但電視遙控器和對講機之間並沒有什麼其它的聯系,除了兩個都有遙控的功能外。這正是我前面所說的這兩種方式剛好代表了設計者兩種不同的側重點。單拿對講機來看,不管是有沒有遙控功能,這部對講機還是一部對講機,可是遙控器呢,除去遙控的功能,那就什麼也不是了。在這裡把IRemoteControlable應用到遙控器的設計上還勉強說得過去,但是把RemoteControl抽象類用於對講機類的設計上就根本說不過去了(前面提到的抽象類代表了"Is a...”, 對講機還是對講機,只是額外具有了有了遙控的功能,可不能因為從RemoteControl繼承下來就變成了遙控器了。但是如果我們的科學進步了,以後有一種遙控器具有短距離通話的功能了,這樣的話,就可以用一個具有ITalkable接口的人RemoteControl繼承的類來表示了,因為本質上它還是叫一個遙控器,只是給它額外加了一個通話的功能而以。

        抽象類和接口是編程語言中的兩種定義抽象類的方式,它們之間有很大的相似性。但是對於它們的選擇卻又往往反映出對於問題領域中的概 念本質的理解、對於設計意圖的反映是否正確、合理,因為它們表現了概念間的不同的關系(雖然都能夠實現需求的功能)。這其實也是語言的一種的慣用法。

        總結一下。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved