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、抽象類主要用於關系密切的對象;而接口適合為不相關的類提供通用功能。
