C#接口,虛方法,抽象方法的差別。
每次寫部落格,第一句話都是這樣的:程式員很苦逼,除了會寫程式,還得會寫部落格!當然,希望将來的一天,某位老闆看到此部落格,給你的程式員職工加點薪資吧!因為程式員的世界除了苦逼就是沉默。我眼中的程式員大多都不愛說話,默默承受着程式設計的巨大壓力,除了技術上的交流外,他們不願意也不擅長和别人交流,更不樂意任何人走進他們的内心,他們常常一個人宅在家中!有上進心的,查查資料,學習新的知識,沒上進心的,在家一日重複一日的打遊戲!
以上發自苦逼程式猿的心聲......
當然,題外話說多了,咱進入正題!
在C#的學習中,容易混淆virtual方法和abstract方法以及C#接口的使用,現在來讨論一下三者的差別。前兩者都牽涉到在派生類中與override的配合使用。
一、Virtual方法(虛方法)
virtual 關鍵字用于在基類中修飾方法。virtual的使用會有兩種情況:
情況1:在基類中定義了virtual方法,但在派生類中沒有重寫該虛方法。那麼在對派生類執行個體的調用中,該虛方法使用的是基類定義的方法。
情況2:在基類中定義了virtual方法,然後在派生類中使用override重寫該方法。那麼在對派生類執行個體的調用中,該虛方法使用的是派生重寫的方法。
二、Abstract方法(抽象方法)
abstract關鍵字隻能用在抽象類中修飾方法,并且沒有具體的實作。抽象方法的實作必須在派生類中使用override關鍵字來實作。請務必将抽象方法放在抽象類中。派生類必須全部實作父類的方法。
三、Interface:接口中的方法沒有具體實作,也就是沒有方法體,必須由繼承者去實作而且必須全部實作。
下面寫了幾個類進行詳細說明(可直接複制粘貼到自己的項目中去實驗)
1、定義一個接口如下:
public interface InterfaceTest
{
/// <summary>
/// 我是接口,請務必把我全部實作
/// </summary>
void Istr();
string Igetstr();
}
此接口包含兩個方法,繼承者必須全部實作。
2、定義一個抽象類
public abstract class AbstractFather
/// 我是抽象方法,請務必把我放在抽象類中。如果我的兒子樂意使用,就必須使用override重寫
public abstract void str();
public abstract string getstr();
3、定義虛方法基類
public class father
/// 我是一個虛方法 可被我的兒子直接使用,也可被我的兒子通過override重寫。
/// <param name="A"></param>
/// <param name="B"></param>
/// <returns></returns>
public virtual string getstr(string A, string B)
return A + B;
public virtual string getstr(string A, string B, string C)
return A + B + C;
4、定義一個繼承抽象類和接口的子類,如下:
/// 我是子類,我繼承抽象類AbstractFather和接口InterfaceTest
public class AbstractChild : AbstractFather, InterfaceTest
/// 子類必須全部實作接口
public void Istr()
throw new NotImplementedException();
public string Igetstr()
/// 子類必須全部實作抽象方法
public override void str()
public override string getstr()
return "";
5、定義一個繼承虛方法基類和接口的子類,如下:
/// 子類必須實作接口的所有方法
/// 我是子類,我直接使用父類的虛方法
public string ChildStr(string A,string B)
return getstr(A,B);
/// 我是子類,我可以重寫父類的虛方法
/// <param name="C"></param>
public override string getstr(string A, string B,string C)
return (A + B + C).Substring(1);