<em id="3iliw"></em>
  • <progress id="3iliw"></progress>
  • <tbody id="3iliw"><pre id="3iliw"></pre></tbody><dd id="3iliw"><noscript id="3iliw"></noscript></dd>

    <progress id="3iliw"></progress>

    杭州.net培訓
    達內杭州.net培訓中心

    13175137725

    .NET中的抽象類和接口

    • 時間:2018-03-27 16:23
    • 發布:杭州.NET培訓
    • 來源:疑難解答

    問題出現:

    我們在使用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)繼承了接口的類必須全部實現接口的方法;

    如果想了解官網關于接口的說明,給你一個地址:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/interface

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

    相同點:(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的爬的方法");

    }

    }

    預約申請免費試聽課

    怕錢不夠?就業掙錢后再付學費!    怕學不會?從入學起,達內定制課程!     擔心就業?達內多家實踐企業供你挑選!

    上一篇:NET程序在Linux容器中的演變
    下一篇:調試.NET中的不同程序集
    • 掃碼領取資料

      回復關鍵字:視頻資料

      免費領取 達內課程視頻學習資料

    • 視頻學習QQ群

      添加QQ群:1143617948

      免費領取達內課程視頻學習資料

    Copyright ? 2018 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

    選擇城市和中心
    江西省

    貴州省

    廣西省

    海南省

    国拍自产亚洲 2019国拍自产在线,国拍自产亚洲,国产a在线不卡 百度 好搜 搜狗
    <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>