c 的多型 使用到的關鍵字說明

2021-04-19 08:15:59 字數 3434 閱讀 2680

個人理解:

用不同的派生類或介面來實現來實現基類的方法,從而達到不同的效果。在實現多型時有可能用到如下關鍵字。

一、new

1)可以不完全替換基類(或叫做隱藏基類)的方法、屬性、字段。如果將派生類的例項強制轉換為基類的例項,就仍然可以呼叫隱藏類的成員。(感覺new關鍵字在這裡的用處不大,即使替換了還可以訪問)

二、virtual override

1)可以完全替換基類(或叫做隱藏基類)的方法、屬性。此關鍵字只能作用於方法、屬性、事件、索引器,不能作用於字段。可以使派生類的例項完全替換來自基類的成員,即使將派生類的例項強制轉換為基類的例項,仍舊訪問的是派生類的成員。

2)可以多層完全替換,無論在派生類和最初宣告虛成員的類之間已宣告了多少個類,虛成員都將永遠為虛成員。如果類 a 宣告了乙個虛擬成員,類 b 從 a 派生,類 c 從類 b 派生,則類 c 繼承該虛擬成員,並且可以選擇重寫它,而不管類 b 是否為該成員宣告了重寫。這時如果強制轉化類c例項為類a,呼叫對應的虛方法,實質仍是呼叫類c例項的虛方法,即使類d繼承類c並隱藏類c的虛方法,這時使用型別為a、c訪問d的例項,呼叫相應的虛方法,實質仍是呼叫類c例項的虛方法。

3)停止替換(密封方法),派生類可以通過將重寫宣告為密封的來停止虛擬繼承。這需要在類成員宣告中將 sealed 關鍵字放在 override 關鍵字的前面。

4)替換密封方法,替換派生類可以通過使用 new 關鍵字替換密封的方法。(感覺這個是new關鍵字的最大用處,可以替換密封方法)

3、base

1)已替換或重寫某個方法或屬性的派生類仍然可以使用此關鍵字訪問該類基類的該方法或屬性。

參考文章:

通過繼承,乙個類可以用作多種型別:可以用作它自己的型別、任何基型別,或者在實現介面時用作任何介面型別。這稱為多型性。c# 中的每種型別都是多型的。型別可用作它們自己的型別或用作 object 例項,因為任何型別都自動將 object 當作基型別。

多型性不僅對派生類很重要,對基類也很重要。任何情況下,使用基類實際上都可能是在使用已強制轉換為基類型別的派生類物件。基類的設計者可以**到其基類中可能會在派生類中發生更改的方面。例如,表示汽車的基類可能包含這樣的行為:當考慮的汽車為小型貨車或敞篷汽車時,這些行為將會改變。基類可以將這些類成員標記為虛成員,從而允許表示敞篷汽車和小型貨車的派生類重寫該行為。

當派生類從基類繼承時,它會獲得基類的所有方法、字段、屬性和事件。若要更改基類的資料和行為,您有兩種選擇:可以使用新的派生成員替換基成員,或者可以重寫虛擬的基成員。

使用新的派生成員替換基類的成員需要使用 new 關鍵字。如果基類定義了乙個方法、欄位或屬性,則 new 關鍵字用於在派生類中建立該方法、欄位或屬性的新定義。new 關鍵字放置在要替換的類成員的返回型別之前。例如:

public class baseclass

public int workfield;

public int workproperty}}

public class derivedclass : baseclass

public new int workfield;

public new int workproperty}}

使用 new 關鍵字時,呼叫的是新的類成員而不是已被替換的基類成員。這些基類成員稱為隱藏成員。如果將派生類的例項強制轉換為基類的例項,就仍然可以呼叫隱藏類成員。例如:

derivedclass b = new derivedclass();

b.dowork();  // calls the new method.

baseclass a = (baseclass)b;

a.dowork();  // calls the old method.

為了使派生類的例項完全接替來自基類的類成員,基類必須將該成員宣告為虛擬的。這是通過在該成員的返回型別之前新增 virtual 關鍵字來實現的。然後,派生類可以選擇使用 override 關鍵字而不是 new,將基類實現替換為它自己的實現。例如:

public class baseclass

public virtual int workproperty}}

public class derivedclass : baseclass

public override int workproperty}}

字段不能是虛擬的,只有方法、屬性、事件和索引器才可以是虛擬的。當派生類重寫某個虛擬成員時,即使該派生類的例項被當作基類的例項訪問,也會呼叫該成員。例如:

derivedclass b = new derivedclass();

b.dowork();  // calls the new method.

baseclass a = (baseclass)b;

a.dowork();  // also calls the new method.

可以使用虛方法和屬性預先計畫未來的擴充套件。因為在呼叫虛成員時不考慮呼叫方正在使用的型別,所以派生類可以選擇更改基類的外在行為。

無論在派生類和最初宣告虛成員的類之間已宣告了多少個類,虛成員都將永遠為虛成員。如果類 a 宣告了乙個虛擬成員,類 b 從 a 派生,類 c 從類 b 派生,則類 c 繼承該虛擬成員,並且可以選擇重寫它,而不管類 b 是否為該成員宣告了重寫。例如:

public class a

}public class b : a}

public class c : b}

派生類可以通過將重寫宣告為密封的來停止虛擬繼承。這需要在類成員宣告中將 sealed 關鍵字放在 override 關鍵字的前面。例如:

public class c : b}

在上面的示例中,方法 dowork 對從 c 派生的任何類都不再是虛方法,但它仍是 c 的例項的虛方法 -- 即使將這些例項強制轉換為型別 b 或型別 a 也是如此。派生類可以通過使用 new 關鍵字替換密封的方法,如下面的示例所示:

public class d : c}

在此情況下,如果在 d 中使用型別為 d 的變數呼叫 dowork,被呼叫的將是新的 dowork。如果使用型別為 c、b 或 a 的變數訪問 d 的例項,對 dowork 的呼叫將遵循虛擬繼承的規則,即把這些呼叫傳送到類 c 的 dowork 實現。

已替換或重寫某個方法或屬性的派生類仍然可以使用基關鍵字訪問基類的該方法或屬性。例如:

public class a

}public class b : a}

public class c : b}

[說明] 說明:

建議虛擬成員在它們自己的實現中使用 base 來呼叫該成員的基類實現。允許基類行為發生使得派生類能夠集中精力實現特定於派生類的行為。未呼叫基類實現時,由派生類負責使它們的行為與基類的行為相容。

C語言 關鍵字說明

1資料型別關鍵字 12個 1 char 宣告字元型變數或函式 2 double 宣告雙精度變數或函式 3 enum 宣告列舉型別 4 float 宣告浮點型變數或函式 5 int 宣告整型變數或函式 6 long 宣告長整型變數或函式 7 short 宣告短整型變數或函式 8 signed 宣告有符...

static 關鍵字的使用及說明

static 關鍵字主要有以下幾種使用場景 1.static 修飾類的成員變數時,被稱為靜態成員變數。引用 static 修飾的成員變數時,無需建立類的例項物件,可直接使用 類.變數名 進行呼叫。示例 public class student public static void main stri...

C 關鍵字使用

關鍵字就是c 中被規定了用途的一些單詞。關鍵字都是小寫字母組成的,在c 中嚴格區分大小寫。using 匯入命名空間要使用的類關鍵字 namespace 命名空間關鍵字 class 類關鍵字 static 靜態的 void 無返回值 資料型別 char 字元型別,儲存用單引號 括起來的字元,char ...