程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> ASP.NET教程:抽象類和接口的比較

ASP.NET教程:抽象類和接口的比較

編輯:關於.NET

1. 引言

在我之前的一篇post《抽象類和接口的誰是誰非》中,和同事管偉的討論,得到很多朋友的關注,因為是不成體系的論道,所以給大家了解造成不便,同時關於這個主題的系統性理論,我認為也有必要做以總結,因此才有了本篇的新鮮出爐。同時,我將把上貼中的問題順便也在此做以交代。

2. 概念引入

●什麼是接口?

接口是包含一組虛方法的抽象類型,其中每一種方法都有其名稱、參數和返回值。接口方法不能包含任何實現,CLR允許接口可以包含事件、屬性、索引器、靜態方法、靜態字段、靜態構造函數以及常數。但是注意:C#中不能包含任何靜態成員。一個類可以實現多個接口,當一個類繼承某個接口時,它不僅要實現該接口定義的所有方法,還要實現該接口從其他接口中繼承的所有方法。

定義方法為:

以下為引用的內容:
public interface System.IComparable
{
    int CompareTo(object o);
}

public class TestCls: IComparable
{
    public TestCls()
    {
    }

    private int _value;
    public int Value
    {
        get { return _value; }
        set { _value = value; }
    }

    public int CompareTo(object o)
    {

        //使用as模式進行轉型判斷
        TestCls aCls = o as TestCls;
        if (aCls != null)
        {

        //實現抽象方法
        return _value.CompareTo(aCls._value);
        }
    }
}

●什麼是抽象類?

抽象類提供多個派生類共享基類的公共定義,它既可以提供抽象方法,也可以提供非抽象方法。抽象類不能實例化,必須通過繼承由派生類實現其抽象方法,因此對抽象類不能使用new關鍵字,也不能被密封。如果派生類沒有實現所有的抽象方法,則該派生類也必須聲明為抽象類。另外,實現抽象方法由overriding方法來實現。

定義方法為:

以下為引用的內容:
/// <summary>
/// 定義抽象類
/// </summary>
abstract public class Animal
{
    //定義靜態字段
    static protected int _id;

    //定義屬性
    public abstract static int Id
    {
        get;
        set;
    }

    //定義方法
    public abstract void Eat();

    //定義索引器
    public string this[int i]
    {
        get;
        set;
    } 
}

/// <summary>
/// 實現抽象類
/// </summary>
public class Dog: Animal
{
    public static override int Id
    {
        get {return _id;}
        set {_id = value;}
    }

    public override void Eat()
    {
        Console.Write("Dog Eats.")
    }
}

4.2 別樣小菜

下面的實例,因為是我的理解,因此給經典打上“相對”的記號,至於什麼時候晉升為“絕對”,就看我在.Net追求的路上,是否能夠一如既往的如此執著,因此我將把相對重構到絕對為止(呵呵)。 本示例沒有闡述抽象類和接口在設計模式中的應用,因為那將是另一篇有討論價值的文本,本文著眼與概念和原則的把握,但是真正的應用來自於具體的需求規范。

設計結構如圖所示:

ASP.NET教程:抽象類和接口的比較_網頁教學網webjx.com整理

1. 定義抽象類

以下為引用的內容:
public abstract class Animal
{
    protected string _name;

    //聲明抽象屬性
    public abstract string Name
    {
        get;
    }

    //聲明抽象方法
    public abstract void Show();

    //實現一般方法
    public void MakeVoice()
    {
        Console.WriteLine("All animals can make voice!");
    }
}

2. 定義接口

以下為引用的內容:
public interface IAction
{
    //定義公共方法標簽
    void Move();
}
3. 實現抽象類和接口

以下為引用的內容:
public class Duck : Animal, IAction
{
    public Duck(string name)
    {
        _name = name;
    }

    //重載抽象方法
    public override void Show()
    {
        Console.WriteLine(_name + " is showing for you.");
    }

    //重載抽象屬性
    public override string Name
    {
        get { return _name;}
    }

    //實現接口方法
    public void Move()
    {
        Console.WriteLine("Duck also can swim.");
    }

}

public class Dog : Animal, IAction
{
    public Dog(string name)
    {
        _name = name;
    }

    public override void Show()
    {
        Console.WriteLine(_name + " is showing for you.");
    }

    public override string Name
    {
        get { return _name; }
    }

    public void Move()
    {
        Console.WriteLine(_name + " also can run.");
    }

}

4. 客戶端實現

以下為引用的內容:

public class TestAnmial
{
    public static void Main(string [] args)
    {
        Animal duck = new Duck("Duck");
        duck.MakeVoice();
        duck.Show();

        Animal dog = new Dog("Dog");
        dog.MakeVoice();
        dog.Show();

        IAction dogAction = new Dog("A big dog");
        dogAction.Move();
    }
}

5. 他山之石

正所謂真理是大家看出來的,所以將園子裡有創新性的觀點潛列於此,一是感謝大家的共享,二是完善一家之言的不足,希望能夠將領域形成知識,受用於我,受用於眾。

●[url=]dunai[/url]認為:抽象類是提取具體類的公因式,而接口是為了將一些不相關的類“雜湊”成一個共同的群體。至於他們在各個語言中的句法,語言細節並不是我關心的重點。 
●桦山澗的收藏也很不錯。 
●Artech認為:所代碼共用和可擴展性考慮,盡量使用Abstract Class。當然接口在其他方面的優勢,我認為也不可忽視。 
●shenfx認為:當在差異較大的對象間尋求功能上的共性時,使用接口;當在共性較多的對象間尋求功能上的差異時,使用抽象基類。

最後,MSDN的建議是:

●如果預計要創建組件的多個版本,則創建抽象類。抽象類提供簡單易行的方法來控制組件版本。通過更新基類,所有繼承類都隨更改自動更新。另一方面,接口一旦創建就不能更改。如果需要接口的新版本,必須創建一個全新的接口。 
●如果創建的功能將在大范圍的全異對象間使用,則使用接口。抽象類應主要用於關系密切的對象,而接口最適合為不相關的類提供通用功能。 
●如果要設計小而簡練的功能塊,則使用接口。如果要設計大的功能單元,則使用抽象類。 
●如果要在組件的所有實現間提供通用的已實現功能,則使用抽象類。抽象類允許部分實現類,而接口不包含任何成員的實現。

6. 結論

接口和抽象類,是論壇上、課堂間討論最多的話題之一,之所以將這個老話題拿出來再議,是因為從我的體會來說,深刻的理解這兩個面向對象的基本內容,對於盤活面向對象的抽象化編程思想至關重要。本文基本概況了接口和抽象類的概念、異同和使用規則,從學習的觀點來看,我認為這些總結已經足以表達其核心。但是,對於面向對象和軟件設計的深入理解,還是建立在不斷實踐的基礎上,Scott說自己每天堅持一個小時用來寫Demo,那麼我們是不是更應該勤於鍵盤呢。對於接口和抽象類,請多用而知其然,多想而知其奧吧。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved