每次寫博客,第一句話都是這樣的:程序員很苦逼,除了會寫程序,還得會寫博客!當然,希望將來的一天,某位老板看到此博客,給你的程序員職工加點薪資吧!因為程序員的世界除了苦逼就是沉默。我眼中的程序員大多都不愛說話,默默承受着編程的巨大壓力,除了技術上的交流外,他們不願意也不擅長和別人交流,更不樂意任何人走進他們的內心,他們常常一個人宅在家中!有上進心的,查查資料,學習新的知識,沒上進心的,在家一日重復一日的打游戲!
以上發自苦逼程序猿的心聲......
當然,題外話說多了,咱進入正題!
在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
{
/// <summary>
/// 我是抽象方法,請務必把我放在抽象類中。如果我的兒子樂意使用,就必須使用override重寫
/// </summary>
public abstract void str();
public abstract string getstr();
}
3、定義虛方法基類
public class father
{
/// <summary>
/// 我是一個虛方法 可被我的兒子直接使用,也可被我的兒子通過override重寫。
/// </summary>
/// <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、定義一個繼承抽象類和接口的子類,如下:
/// <summary>
/// 我是子類,我繼承抽象類AbstractFather和接口InterfaceTest
/// </summary>
public class AbstractChild : AbstractFather, InterfaceTest
{
/// <summary>
/// 子類必須全部實現接口
/// </summary>
public void Istr()
{
throw new NotImplementedException();
}
public string Igetstr()
{
throw new NotImplementedException();
}
/// <summary>
/// 子類必須全部實現抽象方法
/// </summary>
public override void str()
{
}
public override string getstr()
{
return "";
}
}
5、定義一個繼承虛方法基類和接口的子類,如下:
/// <summary>
/// 子類必須實現接口的所有方法
/// </summary>
public void Istr()
{
throw new NotImplementedException();
}
public string Igetstr()
{
throw new NotImplementedException();
}
/// <summary>
/// 我是子類,我直接使用父類的虛方法
/// </summary>
/// <returns></returns>
public string ChildStr(string A,string B)
{
return getstr(A,B);
}
/// <summary>
/// 我是子類,我可以重寫父類的虛方法
/// </summary>
/// <param name="A"></param>
/// <param name="B"></param>
/// <param name="C"></param>
/// <returns></returns>
public override string getstr(string A, string B,string C)
{
return (A + B + C).Substring(1);
}
}
至此:相信大家通過上述事例,應該明白三者之間的區別及聯系了吧!
需要看的都是菜鳥,譬如博主自己!哈哈,開玩笑,~_~