當前位置:編程學習大全網 - 編程語言 - 接口和抽象類的區別是什麽?

接口和抽象類的區別是什麽?

C#抽象類和接口的區別:

1.類是對對象的抽象,可以把抽象類理解為把類當作對象,抽象成的類叫做抽象類.而接口只是壹個行為的規範或規定,微軟的自定義接口總是後帶able字段,證明其是表述壹類類“我能做。。。”.抽象類更多的是定義在壹系列緊密相關的類間,而接口大多數是關系疏松但都實現某壹功能的類中.

2.接口基本上不具備繼承的任何具體特點,它僅僅承諾了能夠調用的方法;

3.壹個類壹次可以實現若幹個接口,但是只能擴展壹個父類

4.接口可以用於支持回調,而繼承並不具備這個特點.

5.抽象類不能被密封。

6.抽象類實現的具體方法默認為虛的,但實現接口的類中的接口方法卻默認為非虛的,當然您也可以聲明為虛的.

7.(接口)與非抽象類類似,抽象類也必須為在該類的基類列表中列出的接口的所有成員提供它自己的實現。但是,允許抽象類將接口方法映射到抽象方法上。

8.抽象類實現了oop中的壹個原則,把可變的與不可變的分離。抽象類和接口就是定義為不可變的,而把可變的座位子類去實現。

9.好的接口定義應該是具有專壹功能性的,而不是多功能的,否則造成接口汙染。如果壹個類只是實現了這個接口的中壹個功能,而不得不去實現接口中的其他方法,就叫接口汙染。

10.盡量避免使用繼承來實現組建功能,而是使用黑箱復用,即對象組合。因為繼承的層次增多,造成最直接的後果就是當妳調用這個類群中某壹類,就必須把他們全部加載到棧中!後果可想而知.(結合堆棧原理理解)。同時,有心的朋友可以留意到微軟在構建壹個類時,很多時候用到了對象組合的方法。比如asp.net中,Page類,有Server Request等屬性,但其實他們都是某個類的對象。使用Page類的這個對象來調用另外的類的方法和屬性,這個是非常基本的壹個設計原則。

11.如果抽象類實現接口,則可以把接口中方法映射到抽象類中作為抽象方法而不必實現,而在抽象類的子類中實現接口中方法.

從編程的角度來看,abstract class和interface都可以用來實現 "design by contract" 的思想。但是在具體的使用上面還是有壹些區別的。

首先,abstract class 在 Java 語言中表示的是壹種繼承關系,壹個類只能使用壹次繼承關系(因為Java不支持多繼承 -- 轉註)。但是,壹個類卻可以實現多個interface。也許,這是Java語言的設計者在考慮Java對於多重繼承的支持方面的壹種折中考慮吧。

其次,在abstract class的定義中,我們可以賦予方法的默認行為。但是在interface的定義中,方法卻不能擁有默認行為,為了繞過這個限制,必須使用委托,但是這會增加壹些復雜性,有時會造成很大的麻煩。

在 抽象類中不能定義默認行為還存在另壹個比較嚴重的問題,那就是可能會造成維護上的麻煩。因 為如果後來想修改類的界面(壹般通過 abstract class 或者interface來表示)以適應新的情況(比如,添加新的方法或者給已用的方法中添 加新的參數)時,就會非常的麻煩,可能要花費很多的時間(對於派生類很多的情況,尤為如此)。但是如果界面是通過abstract class來實現的,那 麽可能就只需要修改定義在abstract class中的默認行為就可以了。

同樣,如果不能在抽象類中定義默認行為,就會導致同樣的方法實現出現在該抽象類的每壹個派生類中,違反了 "one rule,one place" 原則,造成代碼重復,同樣不利於以後的維護。因此,在abstract class和interface間進行選擇時要非常的小心。

  • 上一篇:計算機等級證考試分為幾級啊 具體有什麽用
  • 下一篇:比亞迪建全球最大量產口罩廠,日產500萬只重現20多年前創業激情
  • copyright 2024編程學習大全網