中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-03-06 12:44:38 來源:億速云 閱讀:167 作者:小新 欄目:編程語言

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

問題出現:

我們在使用C#的抽象類和接口的時候,往往會遇到以下類似的問題,大致歸納如下:

(1)抽象類和接口有什么本質的區別和聯系?

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

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

解決方案:

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

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

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

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

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

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

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

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

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

抽象類和接口的區別和聯系:

相同點:(1)都是不能直接實例化,只能通過繼承方式去實現;

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

不同點:

(1)接口支持多繼承;抽象類不能實現多繼承;

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

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

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

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

分析第二個問題,我提出3點建議:

第一個建議,對基礎概念不只是概念的記憶,要多練、多思,然后再多練、再多思,循環幾次,直到熟爛于心;

第二個建議,盡量在自己的項目中使用這方面的知識,去使用它,你才能發現問題,解決問題,才會思考;

第三個建議,對自己使用過的抽象類和接口的項目的知識點進行總結和歸納;
      就什么時候使用抽象類和接口,我總結前輩的經驗,給出以下幾點,僅供參考:

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

(2)當設計的組件同時支持通用的行為動作,可以考慮接口;例如鳥類,人類,車類都可以有聲音,這時候可以設計接口,包含叫的函數行為,然后在各個具體的類中實現;

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

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

以上代碼,只是說明問題,比較簡單;
第三階段(優化階段):就象問題3一樣,我們在做一個抽象類或者接口的時候首先考慮的是能用就行,結果就是定義的類或接口比較多,難以維護和擴展,或者就是類之間有交集,那怎么優化繼承關系?怎樣才能使得程序具有可維護性和擴展性呢?
我個人建議具備以下幾個方面方可:
(1)要有扎實的基礎知識和深厚的基礎功底;
(2)要有一個多問、多思的心;對于抽象類和接口多問問,為什么不使用抽象類而要使用接口?為什么在這個地方使用接口合適?
(3)多看看前輩們是怎么設計接口和類的,這方面的資料網上搜搜不少;
(4)個人建議多看看設計模式這方面的知識,因為他們是前輩在設計時的經驗和思想;

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

曲阜市| 丹江口市| 武安市| 元谋县| 石屏县| 江永县| 通辽市| 波密县| 巨鹿县| 天等县| 班玛县| 林口县| 贵溪市| 黑水县| 奇台县| 旅游| 宁海县| 宁德市| 新源县| 威信县| 威宁| 资讯| 上饶县| 保德县| 军事| 洱源县| 察雅县| 康马县| 莱西市| 石楼县| 镇康县| 三明市| 尖扎县| 政和县| 剑阁县| 镇赉县| 永德县| 化隆| 江城| 无锡市| 高要市|