虛方法(virtual)和抽象方法(abstract)的和接口(interface)的區別

虛方法(virtual)和抽象方法(abstract)的區別

注:本文轉載自 http://www.cnblogs.com/michaelxu/archive/2008/04/01/1132633.htmlhtml

 

虛方法和抽象方法均可以供派生類重寫,它們之間有什麼區別呢?

1. 虛方法必須有實現部分,抽象方法沒有提供實現部分,抽象方法是一種強制派生類覆蓋的方法,不然派生類將不能被實例化。如:編程

//抽象方法
public abstract class Animal
{
    public abstract void Sleep();
    public abstract void Eat();
}

//虛方法
public class Animal
{
    public virtual void Sleep(){}
    public virtual void Eat(){}
}


2. 抽象方法只能在抽象類中聲明,虛方法不是。其實若是類包含抽象方法,那麼該類也是抽象的,也必須聲明爲抽象的。如:ide

public class Animal
{
    public abstract void Sleep();
    public abstract void Eat();
}

 

編譯器會報錯:
Main.cs(10): 'VSTest.Animal.Sleep()' is abstract but it is contained in nonabstract class 'VSTest.Animal'
Main.cs(11): 'VSTest.Animal.Eat()' is abstract but it is contained in nonabstract class 'VSTest.Animal'函數

3. 抽象方法必須在派生類中重寫,這一點跟接口相似,虛方法沒必要。如:post

public abstract class Animal
{
    public abstract void Sleep();
    public abstract void Eat();
}

public class Cat : Animal
{
    public override void Sleep()
    {
        Console.WriteLine( "Cat is sleeping " );
    }
    // we need implement Animal.Eat() here

}

 


編譯器會報錯:Main.cs(14): 'VSTest.Cat' does not implement inherited abstract member 'VSTest.Animal.Eat()',由於咱們沒有實現抽象類中全部抽象方法。flex

 

C#中抽象類和接口的區別

你們在編程時都容易把抽象類和接口搞混,下面爲你們從概念上講解抽象類和接口的區別:spa

     1、抽象類:設計

     含有abstract修飾符的class即爲抽象類,抽象類是特殊的類,只是不能被實例化,能夠建立一個變量,其類型是一個抽象類,並讓它指向具體子類的一個實例;除此之外,具備類的其餘特性;重要的是抽象類能夠包括抽象方法,這是普通類所不能的。抽象方法只能聲明於抽象類中,且不包含任何實現,派生類必須覆蓋它們。另外,抽象類能夠派生自一個抽象類,能夠覆蓋基類的抽象方法也能夠不覆蓋。xml

    2、接口:htm

    接口是引用類型的,相似於類,和抽象類的類似之處有三點:     一、不能實例化;     二、包含未實現的方法聲明;     三、派生類必須實現未實現的方法,抽象類是抽象方法,接口則是全部成員(不只是方法包括其餘成員);

    接口有以下特性:

    接口除了能夠包含方法以外,還能夠包含屬性、索引器、事件,並且這些成員都被定義爲公有的。除此以外,不能包含任何其餘的成員,例如:常量、域、構造函數、析構函數、靜態成員。一個類能夠直接繼承多個接口,但只能直接繼承一個類(包括抽象類)。  

   二者的語法區別:

    1.抽象類能夠有構造方法,接口中不能有構造方法。

    2.抽象類中能夠有普通成員變量,接口中沒有普通成員變量

    3.抽象類中能夠包含非抽象的普通方法,接口中的全部方法必須都是抽象的,不能有非抽象的普通方法。

    4. 抽象類中的抽象方法的訪問類型能夠是public,protected,但接口中的抽象方法只能是public類型的,而且默認即爲public abstract類型。

    5. 抽象類中能夠包含靜態方法,接口中不能包含靜態方法

    6. 抽象類和接口中均可以包含靜態成員變量,抽象類中的靜態成員變量的訪問類型能夠任意,但接口中定義的變量只能是public static final類型,而且默認即爲public static final類型。

    7. 一個類能夠實現多個接口,但只能繼承一個抽象類。

   8.接口能夠用於支持回調,而繼承並不具有這個特色.    9.抽象類實現的具體方法默認爲虛的,但實現接口的類中的接口方法卻默認爲非虛的,固然您也能夠聲明爲虛的.  

   抽象類和接口的使用:

  1.若是預計要建立組件的多個版本,則建立抽象類。抽象類提供簡單的方法來控制組件版本。   2.若是建立的功能將在大範圍的全異對象間使用,則使用接口。若是要設計小而簡練的功能塊,則使用接口。   3.若是要設計大的功能單元,則使用抽象類.若是要在組件的全部實現間提供通用的已實現功能,則使用抽象類。   4.抽象類主要用於關係密切的對象;而接口適合爲不相關的類提供通用功能。

  5.好的接口定義應該是具備專注功能性的,而不是多功能的,不然形成接口污染。若是一個類只是實現了這個接口的中一個功能,而不得不去實現接口中的其餘方法,就叫接口污染。  

相關文章
相關標籤/搜索