C#類、接口、虛方法和抽象方法


C#類、接口、虛方法和抽象方法

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

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. 抽象方法只能在抽象類中聲明, 抽象方法必須在派生類中重寫。虛方法不是也不必要重寫。其實如果類包含抽象方法,那么該類也是抽象的,也必須聲明為抽象的。

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

這樣寫編譯器會報錯。

3. 抽象方法必須在派生類中重寫,這一點跟接口類似,虛擬方法不必。抽象方法不能聲明方法體,而虛擬方法可以。 包含抽象方法的類不能實例化 ,而包含虛方法的類可以實例化!

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
}

編譯器會報錯,因為我們沒有實現抽象類中所有抽象方法。

虛擬方法和抽象方法有什么區別與聯系:

1、抽象方法只有聲明沒有實現代碼,需要在子類中實現;虛擬方法有聲明和實現代碼,並且可以在子類中重寫,也可以不重寫使用父類的默認實現。

2、抽象類不能被實例化(不可以new),只能實例化實現了全部抽象方法的派生類;而包含虛方法的類可以實例化。

3、虛方法與多態性關系密切,虛方法允許派生類完全或部分重寫該類的方法,需寫方法體。抽象方法只是一個定義,沒有方法體,也就是沒有{},也不要在里面寫內容。

4、抽象方法是虛擬方法兩個相像的一點是都用override重寫。

 

非抽象類與接口的差別

非抽象類和接口的差別很大,它們的差別主要表現在以下幾個方面:

1、非抽象類可以有成員變量、常量和構造函數,而接口中不能存在常量、域、操作符、構造函數或析構函數,而且不能包含任何靜態成員。
2、一個非抽象類可以繼承多個接口,而只能繼承一個類;
3、非抽象類中可以定義具體的方法和實現,而接口只定義方法沒有具體的實現;
4、接口成員一定是公共的,而且不能聲明為虛擬或者是靜態的,而非抽象類中是沒有這些限制。
5、非抽象類可以被實例化,而接口不可以。一般來說,非抽象類的內容較接口要豐富得多,非抽象類可以有面向對象所有的絕大部分組成元素。但是接口相對於非抽象類來說更加靈活,兩者在使用上沖突不大,在使用的時候視具體情況而定。

 

、抽象類和接口的使用:
      1、 如果預計要創建組件的多個版本,則創建抽象類。抽象類提供簡單的方法來控制組件版本。
      2、如果創建的功能將在大范圍的全異對象間使用,則使用接口。如果要設計小而簡練的功能塊,則使用接口。
      3、如果要設計大的功能單元,則使用抽象類.如果要在組件的所有實現間提供通用的已實現功能,則使用抽象類。  
      4、抽象類主要用於關系密切的對象;而接口適合為不相關的類提供通用功能。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM