溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C#中抽象類與接口的示例分析

發(fā)布時(shí)間:2021-03-06 12:44:38 來源:億速云 閱讀:165 作者:小新 欄目:編程語言

這篇文章主要介紹C#中抽象類與接口的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

問題出現(xiàn):

我們?cè)谑褂肅#的抽象類和接口的時(shí)候,往往會(huì)遇到以下類似的問題,大致歸納如下:

(1)抽象類和接口有什么本質(zhì)的區(qū)別和聯(lián)系?

(2)什么時(shí)候選擇使用抽象類,然啥時(shí)候使用接口最恰當(dāng)呢?

(3)在項(xiàng)目中怎樣使用才能使得項(xiàng)目更具有可維護(hù)性、擴(kuò)展性?怎樣將它和Struct,類緊密的結(jié)合,達(dá)到最終的雙刃劍作用?

解決方案:

這也是我在學(xué)習(xí)抽象類和接口的時(shí)候遇到的問題,從我歸納的這三個(gè)問題,不難看出這也許是我們大多數(shù)程序員遇到問題的三個(gè)階段,

第一階段(基礎(chǔ)概念):就象問題1一樣,這部分人首先需要掃清基礎(chǔ)概念的障礙,首先得懂得什么叫抽象類,什么叫接口?

然后了解抽象類和接口之間的區(qū)別和聯(lián)系是什么?當(dāng)然這可能需要一段時(shí)間去理解和實(shí)踐,畢竟這些概念比較抽象,屬于那種摸不著看不到的東西,當(dāng)然最主要還是多練習(xí),沒事的時(shí)候做個(gè)Demo實(shí)例,把它們都使用一遍,在使用的過程中多想想為什么要這樣用?這用有什么好處?能不能使用接口呢,如果不能,使用抽象類好處又在哪?這樣可以加深對(duì)它們的理解,這也是我的一點(diǎn)點(diǎn)經(jīng)驗(yàn)吧,呵呵!說了這么多,我還是把問題1總結(jié)一下,一是方便自己記,二是加深理解吧。

抽象類和接口的概念:其實(shí)這些概念在教科書和博客里基本上一大堆,前輩們總結(jié)的也很好了,但是可能在通俗、易懂方面有點(diǎn)晦澀難懂,我就翻譯一下,加點(diǎn)陜西版的白話文,嘿嘿。

(1)抽象類:提供了一組派生類訪問共享基類的公共方法;

抽象類的特性是:(1)抽象類既包括抽象方法,也可以包括方法的實(shí)現(xiàn);(2)抽象類不能被實(shí)例化,也不能被密封;(3)抽象類中的抽象方法要么在派生類中實(shí)現(xiàn),要么用派生抽象類繼承(抽象派生類可以繼承基類抽象方法的),如果要在派生類中實(shí)現(xiàn) 基類的抽象方法,必須使用override 修飾符;(4)抽象類屬于單繼承(這點(diǎn)屬于所有類的同性,在這提一下)(5)抽象類是一族群的抽象,類似于 IS-A;

以上我如果說的還不是很清楚,給你個(gè)官網(wǎng)的關(guān)于抽象類的地址:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/abstract

(2)接口:包含了一組虛方法的抽象類型;

接口的特性是:(1)接口中只包括虛方法的定義,只有聲明定義,沒有函數(shù)實(shí)現(xiàn);(2)接口類中可以包括屬性、事件、索引器等,但不能包括字段;(3)接口類屬于多繼承;(4)繼承了接口的類必須全部實(shí)現(xiàn)接口的方法;

抽象類和接口的區(qū)別和聯(lián)系:

相同點(diǎn):(1)都是不能直接實(shí)例化,只能通過繼承方式去實(shí)現(xiàn);

(2)都是對(duì)事物行為和對(duì)象的抽象,形成一定的設(shè)計(jì)模式;

不同點(diǎn):

(1)接口支持多繼承;抽象類不能實(shí)現(xiàn)多繼承;

(2)接口包括方法、屬性、事件、索引器,不能包括字段;抽象類可以包括字段,也可以包括方法的實(shí)現(xiàn);

(3)接口可以支持回調(diào),抽象類不支持回調(diào)

(4)接口可以作為值類型和引用類型基類,而抽象類只能作為引用類型的基類;

第二階段(使用階段):就象問題2一樣,這部分人對(duì)基礎(chǔ)有了一定的了解,但就是缺乏一定的實(shí)踐,或許就是做個(gè)簡(jiǎn)單的Demo了事,那么什么時(shí)候用抽象類,啥時(shí)用接口呢?

分析第二個(gè)問題,我提出3點(diǎn)建議:

第一個(gè)建議,對(duì)基礎(chǔ)概念不只是概念的記憶,要多練、多思,然后再多練、再多思,循環(huán)幾次,直到熟爛于心;

第二個(gè)建議,盡量在自己的項(xiàng)目中使用這方面的知識(shí),去使用它,你才能發(fā)現(xiàn)問題,解決問題,才會(huì)思考;

第三個(gè)建議,對(duì)自己使用過的抽象類和接口的項(xiàng)目的知識(shí)點(diǎn)進(jìn)行總結(jié)和歸納;
      就什么時(shí)候使用抽象類和接口,我總結(jié)前輩的經(jīng)驗(yàn),給出以下幾點(diǎn),僅供參考:

(1)當(dāng)設(shè)計(jì)的組件將來有多個(gè)版本的時(shí)候一般使用抽象類,例如用C#設(shè)計(jì)數(shù)據(jù)庫DB,剛開始你可能使用的是sql server ,mysql,以后大型的項(xiàng)目可能要使用oracle,DB這種大型的數(shù)據(jù)庫系統(tǒng),那么我們?cè)谠O(shè)計(jì)類的時(shí)候就設(shè)計(jì)一個(gè)抽象的基類DB,讓它具有                       數(shù)據(jù)的一些通用的屬性和方法,屬性:數(shù)據(jù)庫的連接名,版本,數(shù)據(jù)庫類型,數(shù)據(jù)庫的通用方法:Open(),Close()方法等;

(2)當(dāng)設(shè)計(jì)的組件同時(shí)支持通用的行為動(dòng)作,可以考慮接口;例如鳥類,人類,車類都可以有聲音,這時(shí)候可以設(shè)計(jì)接口,包含叫的函數(shù)行為,然后在各個(gè)具體的類中實(shí)現(xiàn);

(3)在繼承了接口的派生類或接口中,一旦該接口需要增加行為方法是個(gè)比較頭疼的事情,必須所有的繼承都必須實(shí)現(xiàn)它的方法,這個(gè)時(shí)候可以在派生類去實(shí)現(xiàn)一個(gè)新增的接口,來實(shí)現(xiàn)派生類的獨(dú)特動(dòng)作,舉例說明:

/// <summary>
/// 實(shí)現(xiàn)一個(gè)爬行動(dòng)物的動(dòng)作接口
/// </summary>
interface IAnimalClimb
{
void Climb();
}
/// <summary>
/// 實(shí)現(xiàn)一個(gè)會(huì)叫的動(dòng)物的動(dòng)作接口
/// </summary>
interface ICry
{
void Cry();
}
/// <summary>
/// 實(shí)現(xiàn)一個(gè)動(dòng)物抽象類
/// </summary>
public abstract class Animal
{
//動(dòng)物的名字
public string Name { get; set; }
//動(dòng)物的顏色
public string Color { get; set; }
//動(dòng)物抽象類的共有方法
public abstract void Sleep();
public abstract void Breathe();
}
/// <summary>
/// 定義鳥類,通用方法是會(huì)飛
/// </summary>
public class Bird : Animal,ICry
{
public override void Sleep()
{
Console.WriteLine("Bird派生類繼承了基類的Sleep()方法");
}
public override void Breathe()
{
Console.WriteLine("Bird派生類繼承了基類的Breathe()方法");
}
//鳥類可以繼承統(tǒng)一的接口動(dòng)作,例如:叫
public void Cry()
{
Console.WriteLine("Bird派生類繼承了接口ICry的叫的方法");
}
}
/// <summary>
/// 定義爬行動(dòng)物類
/// </summary>
public class Snake : Animal, IAnimalClimb
{
public override void Breathe()
{
Console.WriteLine("Snake派生類繼承了基類的Sleep()方法");
}
public override void Sleep()
{
Console.WriteLine("Snake派生類繼承了基類的Sleep()方法");
}
//爬行動(dòng)物可以繼承統(tǒng)一的接口動(dòng)物,例如:爬
public void Climb()
{
Console.WriteLine("Snake派生類繼承了接口IAnimalClimb的爬的方法");
}
}

以上代碼,只是說明問題,比較簡(jiǎn)單;
第三階段(優(yōu)化階段):就象問題3一樣,我們?cè)谧鲆粋€(gè)抽象類或者接口的時(shí)候首先考慮的是能用就行,結(jié)果就是定義的類或接口比較多,難以維護(hù)和擴(kuò)展,或者就是類之間有交集,那怎么優(yōu)化繼承關(guān)系?怎樣才能使得程序具有可維護(hù)性和擴(kuò)展性呢?
我個(gè)人建議具備以下幾個(gè)方面方可:
(1)要有扎實(shí)的基礎(chǔ)知識(shí)和深厚的基礎(chǔ)功底;
(2)要有一個(gè)多問、多思的心;對(duì)于抽象類和接口多問問,為什么不使用抽象類而要使用接口?為什么在這個(gè)地方使用接口合適?
(3)多看看前輩們是怎么設(shè)計(jì)接口和類的,這方面的資料網(wǎng)上搜搜不少;
(4)個(gè)人建議多看看設(shè)計(jì)模式這方面的知識(shí),因?yàn)樗麄兪乔拜呍谠O(shè)計(jì)時(shí)的經(jīng)驗(yàn)和思想;

以上是“C#中抽象類與接口的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI