一個用在類上,一個用在行為上
介面
1,可多繼承
2,只能有定義不能有實現
抽象類別
1,不可多繼承
2,可有定義,可有實現
------------
結論 抽象類別=(介面+類)- 介面之繼承
備忘: 多繼承還是非常重要的一個地方,很多現成的類,如果你想 擴充 那麼通常只能用介面而不能用
抽象類別或普通類,因為這些類都有其它的顯示基類 比如 Form1:Form等等。
因此介面是比較輕量級的設計 ,而抽象類別是比較重量級的實現 方式。
簡單來說,
介面是公開的,裡面不能有私人的方法或變數,是用於讓別人使用的,而抽象類別是可以有私人方法或私人變數的,
另外,實現介面的一定要實現介面裡定義的所有方法,而實現抽象類別可以有選擇地重寫需要用到的方法,一般的應用裡,最頂級的是介面,然後是抽象類別實現介面,最後才到具體類實現。
還有,介面可以實現多重繼承,而一個類只能繼承一個超類,但可以通過繼承多個介面實現多重繼承,介面還有標識(裡面沒有任何方法,如Remote介面)和資料共用(裡面的變數全是常量)的作用.
1.abstract class 在 Java 語言中表示的是一種繼承關係,一個類只能使用一次繼承關係。但是,一個類卻可以實現多個interface.
2.在abstract class 中可以有自己的資料成員,也可以有非abstarct的成員方法,而在interface中,只能夠有靜態不能被修改的資料成員(也就是必須是 static final的,不過在 interface中一般不定義資料成員),所有的成員方法都是abstract的。
3.abstract class和interface所反映出的設計理念不同。其實abstract class表示的是"is-a"關係,interface表示的是"like-a"關係。
4.實現抽象類別和介面的類必須實現其中的所有方法。抽象類別中可以有非抽象方法。介面中則不能有實現方法。
5.介面中定義的變數預設是public static final 型,且必須給其初值,所以實作類別中不能重新定義,也不能改變其值。
6.抽象類別中的變數預設是 friendly 型,其值可以在子類中重新定義,也可以重新賦值。
7.介面中的方法預設都是 public,abstract 類型的。
====================================
抽象方法是必須實現的方法。就象動物都要呼吸。但是魚用鰓呼吸,豬用肺呼吸。動物類要有呼吸方法。怎麼呼吸就是子類的事了。
現在有很多討論和建議提倡用interface代替abstract類,兩者從理論上可以做一般性的混用,但是在實際應用中,他們還是有一定區別的。抽象類別一般作為公用的父類為子類的擴充提供基礎,這裡的擴充包括了屬性上和行為上的。而介面一般來說不考慮屬性,只考慮方法,使得子類可以自由的填補或者擴充介面所定義的方法,就像Java王子所說的事件中的適配器就是一個很好的應用。
用一個簡單的例子,比如說一個教師,我們把它作為一個抽象類別,有自己的屬性,比如說年齡,教育程度,教師編號等等,而教師也是分很多種類的,我們就可以繼續教師類而擴充特有的種類屬性,而普遍屬性已經直接繼續了下來。
而介面呢~還是拿教師做例子,教師的行為很多,除了和普通人相同的以外,還有職業相關的行為,比如改考卷,講課等等,我們把這些行為定義成無body 的方法,作為一個集合,它是一個interface。而教師張三李四的各自行為特點又有不同,那麼他們就可以擴充自己的行為body。從這點意義上來說,interface偏重於行為。
總之,在許多情況下,介面確實可以代替抽象類別,假如你不需要刻意表達屬性上的繼續的話。
現在面對大量冗餘的資訊,不能直接篩選出簡單有用的資訊才會問這樣的問題,特別是這樣概念性的東西,巧妙的記憶也是很關鍵的。
我之前也是死活記不住這應用,但是網路上的一個資訊很關鍵:
abstract class和interface所反映出的設計理念不同。其實abstract class表示的是"is-a"關係,interface表示的是"like-a"關係。
abstract有一種反應本質的含義,比如貓是動物,狗也是動物,所以可以寫一個抽象類別:動物,然後貓和狗都繼承動物抽象類別。
interface有一種行為含義,更加具體的意義,比如定義一個介面:行為,行為中有很多方法:玩耍,吃飯,睡覺,然後貓和狗實現行為介面,他們就都要實現具體的方法:如何玩耍,如何吃飯,如何睡覺。
在設計上有這樣的一個概念:一般的應用裡,最頂級的是介面,然後是抽象類別實現介面,最後才到具體類實現。
上面的例子設計思路就是:首先定義行為的介面,然後定義抽象類別動物實現行為介面,然後再到具體的類實現動物抽象類別。
記憶的方式每個人都不一樣,選擇合適自己的方法來記憶很關鍵。
類是對象的抽象。
抽象類別是對類的抽象
介面是對行為的抽象。
抽象類別和介面有很多相似之處:
介面表示調用者和設計者的一種約定,在多人合作開發同一個項目時,事先定義好相互調用的介面可以大大提高開發的效率。介面是用類來實現的,實現介面的類必須嚴格按照介面的聲明來實現介面提供的所有功能。有了介面,就可以在不影響現有介面聲明的情況下,修改介面的內部實現,從而使相容性問題最小化。
當其他設計者調用了介面後,就不能再隨意更改介面的定義,否則項目開發人員事先的約定就失去了意義。但是可以在類中修改相應的代碼,完成需要改動的內容。
抽象類別是指這個類是不完全可用的,只能作為其它類的基類。抽象類別和其它非抽象類別的最大區別之處在於:抽象類別不能被執行個體化。
1) 抽象類別和介面都不能被執行個體化
2)介面是完全抽象的成員集合;抽象類別可以完全實現,也可以部分實現或者根本不實現,從而封裝繼承類的通用功能
3) 抽象類別只能作為基類使用,介面可以從其它基底介面繼承
4)介面成員預設訪問方式是public,介面成員定義不能包含任何存取修飾詞;抽象類別則不然
5) 介面中不能聲明任何種類的靜態成員,抽象類別則可以
6) 介面成員必須只能是方法、屬性、索引器和事件,且不提供實現;抽象類別還可以聲明欄位以及實現的方法和屬性等
7) 抽象方法只能在抽象類別中聲明
使用介面或抽象類別為組件提供多態性主要考慮以下幾個方面:
1. 如果預計要建立組件的多個版本,則建立抽象類別。抽象類別提供簡單易行的方法來控制組件版本。通過更新基類,使所有繼承類都自動更新。另一方面,為了保護為使用介面而編寫的現有系統,要求介面一旦建立就不能更改。如果需要介面的新版本,必須建立一個全新的介面。
2. 如果建立的功能將在大範圍的完全不同的對象間使用,則使用介面。抽象類別應主要用於關係密切的對象,而介面最適合為不相關的類提供通用功能。
3. 如果要設計小而簡煉的功能塊,則使用介面;如果設計大的功能單元,則使用抽象類別。設計優良的介面往往很小且相互獨立,減少發生效能問題的可能。
4. 如果要在組件的所有實現間傳遞通用的已實現功能,則使用抽象類別。抽象類別允許部分實作類別,而介面不包含任何成員的實現。
概括起來講:
橫看介面豎看類:橫向擴充用介面;縱向擴充用抽象基類;橫向和縱向都擴充,用抽象基類繼承介面。
差異較大的對象中追求功能上的相同時,使用介面;
差異較小的對象中追求功能上的不同時,使用抽象接類。