基礎 C 繼承,抽象類,密封類,類的多型性

2021-06-16 05:10:29 字數 3102 閱讀 1144

類可以從其他類中繼承。

新類(即派生類)將獲取基類的所有非私有資料和行為以及新類為自己定義的所有其他資料或行為。因此,新類具有兩個有效型別:新類的型別和它繼承的類的型別。

在上面的示例中,類 b 既是有效的 b,又是有效的 a。訪問 b 物件時,可以使用強制轉換操作將其轉換為 a 物件。強制轉換不會更改 b 物件,但您的 b 物件檢視將限制為 a 的資料和行為。將 b 強制轉換為 a 後,可以將該 a 重新強制轉換為 b。並非 a 的所有例項都可強制轉換為 b,只有實際上是 b 的例項的那些例項才可以強制轉換為 b。如果將類 b 作為 b 型別訪問,則可以同時獲得類 a 和類 b 的資料和行為。物件可以表示多個型別的能力稱為多型性。有關更多資訊,請參見多型性(c# 程式設計指南)。有關強制轉換的更多資訊,請參見強制轉換(c# 程式設計指南)。

抽象類和類成員

使用abstract關鍵字可以建立僅用於繼承用途的類和類成員,即定義派生的非抽象類的功能。使用 sealed 關鍵字可以防止繼承以前標記為 virtual 的類或某些類成員。有關更多資訊,請參見如何:定義抽象屬性(c# 程式設計指南)。

publicabstractclass a

抽象類不能例項化。抽象類的用途是提供多個派生類可共享的基類的公共定義。

抽象類也可以定義抽象方法。方法是將關鍵字 abstract 新增到方法的返回型別的前面。例如:

publicabstractclass a

抽象方法沒有實現,所以方法定義後面是分號,而不是常規的方法塊。抽象類的派生類必須實現所有抽象方法。當抽象類從基類繼承虛方法時,抽象類可以使用抽象方法重寫該虛方法。例如:

//compile with: /target:library

public

classd}

public

abstract

class

e : d

public

class

f : e}

如果將虛方法宣告為抽象方法,則它對於從抽象類繼承的所有類而言仍然是虛的。繼承抽象方法的類無法訪問該方法的原始實現。在前面的示例中,類 f 上的 dowork 無法呼叫類 d 上的 dowork。在此情況下,抽象類可以強制派生類為虛方法提供新的方法實現。

密封類和類成員

可以將類宣告為密封類。方法是在類定義中將關鍵字 sealed 置於關鍵字 class 的前面。例如:

publicsealedclass d

密封類不能用作基類。因此,它也不能是抽象類。密封類主要用於防止派生。由於密封類從不用作基類,所以有些執行時優化可以使對密封類成員的呼叫略快。

在對基類的虛成員進行重寫的派生類上的類成員、方法、字段、屬性或事件可以將該成員宣告為密封成員。在用於以後的派生類時,這將取消成員的虛效果。方法是在類成員宣告中將 sealed 關鍵字置於 override 關鍵字的前面。例如:

public class d : c }

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

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

無論在派生類和最初宣告虛擬成員的類之間已宣告了多少個類,虛擬成員都將永遠為虛擬成員。如果類 a 宣告了乙個虛擬成員,類 b 從 a 派生,類 c 從類 b 派生,則類 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 實現。

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

base關鍵字用於從派生類中訪問基類的成員:

public

classa}

public

class

b : a

}public

class

c : b}

public

classa}

public

class

b : a

}public

class

c : b}

derivedclass b 

=new

derivedclass();

b.dowork();  

//calls the new method.

baseclass a 

=(baseclass)b;

a.dowork();  

//also calls the new method.

public

class

baseclass

public

virtual

intworkproperty}}

public

class

derivedclass : baseclass

public

override

intworkproperty}}

public

classa}

public

class

b : a}

C 繼承,抽象類,密封類,類的多型性

類可以從其他類中繼承。新類 即派生類 將獲取基類的所有非私有資料和行為以及新類為自己定義的所有其他資料或行為。因此,新類具有兩個有效型別 新類的型別和它繼承的類的型別。在上面的示例中,類 b 既是有效的 b,又是有效的 a。訪問 b 物件時,可以使用強制轉換操作將其轉換為 a 物件。強制轉換不會更改...

抽象類和密封類

基本概念 包含抽象方法的類叫做抽象類。抽象方法被abstract修飾,類也要由abstract修飾。抽象類中可以有抽象方法,也可以有非抽象方法。抽象類不能建立例項物件 不能new抽象類。抽象類中可以沒有抽象方法,但是抽象方法一定在抽象類中。因為抽象類不能被例項化,抽象方法不能被實現。抽象類和普通類的...

C 抽象類 密封類及類成員

1.抽象類和類成員 使用 abstract 關鍵字可以建立必須在派生類中實現的不完整的類和類成員。例如 public abstract class a 抽象類不能例項化。抽象類的用途是提供多個派生類可共享的基類的公共定義。例如,類庫可以定義乙個作為其多個函式的引數的抽象類,並要求程式設計師使用該庫通...