C 抽象方法和虛擬方法理解

2022-01-19 03:00:47 字數 1663 閱讀 4288

首先在c#中虛方法的定義:

public virtual void virtualmethod();

只要在方法名前加上virtual,就宣告了該方法為虛方法,注意宣告為虛方法後再不能加上abstract,static關鍵字宣告

以下是插入乙個例項來說明虛方法與非虛方法的不同

public class a

public void normalmethod()

}public class b : a

public new void normalmethod()

}在main函式中執行:

b b = new b();

a a = b;//將派生類的例項賦給基類的物件

a.virmethod();

a.normalmethod();

b.virmethod();

b.normalmethod();

console.readkey();

執行結果:virtual method b

normal method a

virtual method b

normal method b

通過結果表示 a.virmethod() 虛方法是執行了b類的重寫的方法;

a.normalmethod();非虛方法還是執行了a類本身的方法;

a a = b 這步操作是通過派生類的例項來構造基類的物件,基類指標實際上是指向派生類的物件;所以a.virmethod()這一步呼叫的是派生類重寫了的方法。

而a.normalmethod() 還是呼叫基類的方法

(在這裡插下:override是重寫了基類的虛方法,new 是新建立乙個方法,就是與基類同名而已,但還是子類的自已的方法)

override是過載(有的翻譯為覆蓋),new是隱藏。

再補充一下:a a = b; 其中a是宣告類,b是例項類

在呼叫函式的時候,系統是先去看宣告類,如果函式不是虛函式,就直接呼叫宣告類的,如果是虛函式,它會轉去檢查物件的例項類.(個人覺得挺有道理的)

如果繼承是物件導向設計理論的基石,那麼抽象理論和方法就是繼承理論的頂梁柱。在漢語詞典中抽象是這樣解釋的:將幾個有區別的物體的共同特性或形象抽取出來或孤立地進行考慮的行動或過程。可以看出,抽象就是從事物中提取特徵和性質,並不是事物本身。具體應該如何理解呢?

大家都知道,學生有乙個共同的特徵是必須學習,那麼學什麼,如何學,每乙個學生就不一樣了。這樣可以提取學習這個動作為抽象方法,而不考慮具體內容。動物類都有叫的動作,具體動物如何叫,暫不考慮,先把共性提取出來。簡單地說,用來描述這些共性的類就是抽象類,抽象類中不考慮具體實現,只確定必須具有的行為,就是抽象方法。

抽象方法是乙個沒有實現的方法,使用關鍵字abstract定義抽象方法。語法如下:

《訪問修飾符》 abstract 返回型別 方法();

例如:public abstract void cry();

當乙個例項方法宣告中含有abstract修飾符時,稱之為抽象方法(abstract methods)。抽象方法只允許在抽象類中宣告,但是並不能實現,抽象方法宣告中只包含方法的簽名,抽象方法在其派生類中使用override關鍵字來重寫。在抽象方法宣告中,不允許出現static、virtual或override中的任一修飾符。

注意:和普通方法不同,抽象方法沒有閉合大括號,在方法括號後面直接加「;」號,表明抽象方法中沒有方法體,即沒有具體的實現。

C 虛擬方法和抽象方法的區別

虛擬方法必須有實現部分,抽象方法不可以有實現部分 虛擬方法可以在派生類中重寫也可以不重寫,抽象方法必須在派生類中重寫 虛擬方法可以在任何非密封類中宣告,抽象方法只能在抽象類中宣告 如果類包含抽象方法,那麼該類也必須為抽象的,不能例項化。宣告乙個抽象類 1.抽象類中可以包含變數 2.抽象方法中無法宣告...

ROW NUMBER 方法理解

該函式的應用場景在於對錶中某個字段分組排序後,返回每個組別的行號 可以這麼理解 完整函式為row number over partition col1 ordoer by col2 可以理解為 對col1分組,按照col2排序,對col1的每個組的資料行返回乙個序號,從1開始。示例 表teacher...

sort方法 理解

static void sort list list 型別 t 必須實現 comparable 介面,並且這個介面的型別是 t。只有這樣,t 的例項之間才能相互比較大小。例如,在實際呼叫時若使用的具體類是 dog,那麼 dog 必須 implements comparable。型別 t 必須實現 c...