天天看點

淺談C#抽象方法、虛方法、接口

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);