C 中的虛方法 抽象方法 抽象類 介面的聯絡與區別

2021-07-26 08:41:15 字數 1821 閱讀 8037

虛方法的關鍵字是virtual

抽象方法的關鍵字是abstract

重寫都是override 虛方法也可以new

虛方法和抽象方法的區別:

虛方法:可以在抽象類和非抽象類中定義,可以寫在父類中,在子類中可以被重寫,在定義虛方法時必須實現虛方法

(在定義虛方法時需要寫實現方法的**或者至少要寫乙個分號)

抽象方法:必須定義在抽象類中,必須寫在父類中,在子類中必須被重寫,在定義抽象方法時不能實現方法

(在定義抽象方法時不能有大括號和**)

注:如果我們實現的這個功能它的一部分功能(輸出)要寫在父類中,而且在不同的子類中需要重寫,那麼在父類中的方法必須定義為虛方法,

否則,如果在父類中只需要指定有什麼功能,但不需要實現,這個時候我們就把父類中的方法定義為抽象方法。

說說抽象類的理解吧:

既然是抽象類,那麼就是對事物的抽象描述,它描述的是個體的共性。那馬這種動物來說,我們所說的馬就是乙個抽象類。世界上存在很多種馬,白馬,黑馬,紅馬......如果沒有抽象的概念,我們就沒法獲得世界上所有馬,因為我們要說馬的時候,必須指定是哪種馬!但是我們其實是有抽象的概念的,我們定義了馬這樣的乙個概念,用來指代世界上所有的馬。但馬在這個世界上並不是真實存在的,你所能看見的馬一定是某一種型別的馬!

所以說,抽象類就是這樣一種類,描述了一種事物的共性,它不能例項化,只能通過它的子類例項化。

抽象方法:抽象方法一定是抽象類裡面的,抽象的方法沒有主體,就是沒有實現**,它的實現是由子類實現的。如果乙個抽象類裡面全是抽象方法的畫,那麼這個類和介面的功能基本就是一致,而抽象類和介面不一樣的地方就在於抽象類可以有非抽象的方法。

virtual 關鍵字用於修飾方法、屬性、索引器或事件宣告,並使它們可以在派生類中被重寫。例如,此方法可被任何繼承它的類重寫。

標記為虛方法的方法,可以在子類被重寫。也就說子類可以變異。還是馬類為例:

public abstract class 馬類

}public class 紅馬 : 馬類

//在這裡變異了,消化能力超強

public override void 消化()

}在這裡要說明一點是隱藏與重寫的區別。

重寫:繼承時發生,在子類中重新定義父類中的方法,子類中的方法和父類的方法是一樣的

隱藏:在派生類中使用new宣告乙個跟父類一樣的方法,那麼父類的方法將被隱藏起來,但是還是存在的,可以用base來呼叫。這樣相當於子類有兩套名稱一樣的方法。

public virtual void prinf() 

public override void prinf() 

public new void prinf() 

下面的例子說明了c#虛擬方法與非虛方法的區別。

例子:using system;

class a

public

virtual

void g()

} class b:a

public

override

void g()

} class test

}

例子中,a類提供了兩個方法:非虛的f和c#虛擬方法 g.類b則提供了乙個新的非虛的方法f,從而覆蓋了繼承的f;類b同時還過載了繼承的方法g.那麼輸出應該是:

a.fb.f

b.gb.g

注意到本例中,方法a.g()實際呼叫了b.g,而不是a.g.這是因為編譯時值為a,但執行時值為b,所以b完成了對方法的實際呼叫。

虛方法,抽象類 ,介面

抽象類不能被例項化 只能宣告方法,不能實現,只能有他的 是乙個隱式的虛方法 抽象類裡的方法不能是私有的 如果抽象是私有的,那麼他的子類訪問不了它 在抽象方法中使用static和virtual修飾符是錯誤的 在靜態屬性中使用abstract是錯誤的 abstract方法只能在抽象類中宣告 而virtu...

介面 抽象類 抽象方法 虛方法 的區別

介面 抽象類 抽象方法 虛方法 的區別 介面 抽象類 抽象方法 虛方法 這四個名詞時非常容易混淆的 首先說一下介面 與抽象類 的異同 相同點 1.他們都不能例項化自己,也就是說都是用來被繼承的。2.抽象類中的抽象方法和介面方法一樣,都不能有方法體 不同點 1.抽象類裡可以有欄位,介面中不能有欄位.2...

介面 抽象類 抽象方法 虛方法 的區別

首先說一下介面 與抽象類 的異同 相同點 1.他們都不能例項化自己,也就是說都是用來被繼承的。2.抽象類中的抽象方法和介面方法一樣,都不能有方法體 不同點 1.抽象類裡可以有欄位,介面中也可以有欄位.2.抽象類中的普通方法可以有方法體,而介面方法沒有方法體。3.介面中的方法不能有訪問修飾符,抽象類中...