C#抽象類和接口的區(qū)別分析
很多C#的初學(xué)者在編程時(shí)都容易把抽象類和接口搞混,本文就為大家從概念上講解抽象類和接口的區(qū)別:
一、抽象類:
含有abstract修飾符的class即為抽象類,抽象類是特殊的類,只是不能被實(shí)例化,可以創(chuàng)建一個(gè)變量,其類型是一個(gè)抽象類,并讓它指向具體子類的一個(gè)實(shí)例;除此以外,具有類的其他特性;重要的是抽象類可以包括抽象方法,這是普通類所不能的。抽象方法只能聲明于抽象類中,且不包含任何實(shí)現(xiàn),派生類必須覆蓋它們。另外,抽象類可以派生自一個(gè)抽象類,可以覆蓋基類的抽象方法也可以不覆蓋。
二、接口:
接口是引用類型的,類似于類,和抽象類的相似之處有三點(diǎn):
1、不能實(shí)例化;
2、包含未實(shí)現(xiàn)的方法聲明;
3、派生類必須實(shí)現(xiàn)未實(shí)現(xiàn)的方法,抽象類是抽象方法,接口則是所有成員(不僅是方法包括其他成員);
接口有如下特性:
接口除了可以包含方法之外,還可以包含屬性、索引器、事件,而且這些成員都被定義為公有的。除此之外,不能包含任何其他的成員,例如:常量、域、構(gòu)造函數(shù)、析構(gòu)函數(shù)、靜態(tài)成員。一個(gè)類可以直接繼承多個(gè)接口,但只能直接繼承一個(gè)類(包括抽象類)。
兩者的語法區(qū)別:
1.抽象類可以有構(gòu)造方法,接口中不能有構(gòu)造方法。
2.抽象類中可以有普通成員變量,接口中沒有普通成員變量
3.抽象類中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的普通方法。
4. 抽象類中的抽象方法的訪問類型可以是public,protected,但接口中的抽象方法只能是public類型的,并且默認(rèn)即為public abstract類型。
5. 抽象類中可以包含靜態(tài)方法,接口中不能包含靜態(tài)方法
6. 抽象類和接口中都可以包含靜態(tài)成員變量,抽象類中的靜態(tài)成員變量的訪問類型可以任意,但接口中定義的變量只能是public static final類型,并且默認(rèn)即為public static final類型。
7. 一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,但只能繼承一個(gè)抽象類。
8.接口可以用于支持回調(diào),而繼承并不具備這個(gè)特點(diǎn). 9.抽象類實(shí)現(xiàn)的具體方法默認(rèn)為虛的,但實(shí)現(xiàn)接口的類中的接口方法卻默認(rèn)為非虛的,當(dāng)然您也可以聲明為虛的.
抽象類和接口的使用:
1.如果預(yù)計(jì)要?jiǎng)?chuàng)建組件的多個(gè)版本,則創(chuàng)建抽象類。抽象類提供簡單的方法來控制組件版本。
2.如果創(chuàng)建的功能將在大范圍的全異對(duì)象間使用,則使用接口。如果要設(shè)計(jì)小而簡練的功能塊,則使用接口。
3.如果要設(shè)計(jì)大的功能單元,則使用抽象類.如果要在組件的所有實(shí)現(xiàn)間提供通用的已實(shí)現(xiàn)功能,則使用抽象類。
4.抽象類主要用于關(guān)系密切的對(duì)象;而接口適合為不相關(guān)的類提供通用功能。
5.好的接口定義應(yīng)該是具有專一功能性的,而不是多功能的,否則造成接口污染。如果一個(gè)類只是實(shí)現(xiàn)了這個(gè)接口的中一個(gè)功能,而不得不去實(shí)現(xiàn)接口中的其他方法,就叫接口污染。
希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。
相關(guān)文章
C#中TreeView節(jié)點(diǎn)的自定義繪制方法
這篇文章主要介紹了C#中TreeView節(jié)點(diǎn)的自定義繪制方法,實(shí)例展示了TreeView節(jié)點(diǎn)的操作技巧,需要的朋友可以參考下2015-02-02C#連接db2數(shù)據(jù)庫的實(shí)現(xiàn)方法
本篇文章是對(duì)C#連接db2數(shù)據(jù)庫的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Unity實(shí)現(xiàn)物體弧線運(yùn)動(dòng)到規(guī)定的坐標(biāo)
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)物體以弧線的形式運(yùn)動(dòng)到規(guī)定的坐標(biāo),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06C#基于Linq和反射實(shí)現(xiàn)數(shù)據(jù)持久化框架Xml4DB詳解
在本篇文章里小編給大家整理的是關(guān)于C#基于Linq和反射實(shí)現(xiàn)數(shù)據(jù)持久化框架Xml4DB相關(guān)知識(shí)點(diǎn),有需要的朋友們學(xué)習(xí)下。2019-08-08