[英]multi level inheritance in C# without 'virtual' keyword
我是C#的新手,只是一個關於多級繼承的問題假設我們有以下類:
Class Employee
{
public virtual void CalculateBonus() {
...
}
}
class SalesPerson : Employee
{
public override void CalculateBonus() {
...
}
}
假設我們還有另一個派生自SalesPerson的類
class PTSalesPerson : SalesPerson
{
public override void CalculateBonus() {
...
}
}
所以我的問題很簡單,基類中的virtual關鍵字需要被其子類覆蓋。 應用相同的邏輯,virtual關鍵字也應在SalesPerson類中應用如下:
class SalesPerson : Employee
{
public virtual override void CalculateBonus() {
... //compiler error
}
}
這樣PTSalesPerson可以覆蓋其父方法。 這是否意味着“虛擬”關鍵字只需要出現在1級基類中? 還是覆蓋=覆蓋+虛擬?
您不能將覆蓋的方法標記為virtual
方法,因為按定義它已經是虛擬的
備注
調用虛擬方法時,將檢查對象的運行時類型是否有重寫成員。 如果沒有派生類重寫該成員,則將調用最派生類中的重寫成員,該成員可能是原始成員。
默認情況下,方法是非虛擬的。 您不能覆蓋非虛擬方法。
您不能將虛擬修飾符與靜態,抽象,私有或替代修飾符一起使用。
如果這樣做,則會出現令人討厭的編譯時錯誤
標記為替代的成員“功能”不能標記為新成員或虛擬成員
用new和override關鍵字標記方法是互斥的。
為了回答潛在的問題,您可以用virtual
標記需要覆蓋的最低級別,然后任何派生類都可以override
它
VIRTUAL關鍵字意味着任何子級的類都可以重寫給定的函數。
因此,如果沒有一個子級別的類具有該函數的覆蓋聲明,則它們都將仍然具有該函數,它將直接進入最頂層的雇員類。
例如,如果僅對PTSalesPerson類進行了覆蓋,則只有THAT類具有不同的功能... Employee和SalesPerson仍將在函數/方法的“ Employee”級別聲明上進行操作。
這對您有幫助嗎?
一旦任何方法在其父層次結構中被聲明為虛擬方法,則無論其級別如何,任何子級都將始終有可能從其父級覆蓋。 而且,假設您有一個層次結構級別
Class1
Class2 : Class1
Class3 : Class2
Class4 : Class3
並且您在Class3處聲明覆蓋。...Class4的實例將基於IT的父對象運行,它是Class3對方法調用的實現,而不是Class1的聲明。
現在,如果要進行組合,則始終可以調用base方法,然后執行更多操作。
例如:
Class Employee
{
public decimal MyBonus = 0.0m;
public virtual void CalculateBonus()
{
MyBonus = MySales * .13m;
}
}
class SalesPerson : Employee
{
}
class PTSalesPerson : SalesPerson
{
public override void CalculateBonus()
{
// go do the NORMAL Calculation at the EMPLOYEE Level
base.CalculateBonus();
// Now continue from that... As Part-Time sales person,
// they get 1/4 of that rate. So take whatever the result
// WAS and multiply by .25
MyBonus = MyBonus * .25m;
}
}
澄清方法調用鏈
根據您的評論/問題,PTSalesPerson將覆蓋的方法將是Employees,因為這是鏈上的下一個聲明的方法...對於測試,請像上面一樣創建您自己的類,然后執行一個MessageBox.Show(“ something”)看看發生了什么。 如果SalesPerson類具有已聲明的方法,則THAT將被覆蓋,但同時也是被調用的“ base.CalculateBonus”。
想想“基地”。 作為家庭等級。 您是父母的孩子...是您祖父母的孩子。 所以你的“基礎”。 將是您的直接父母。
關於繼承的其他要點
我沒有透露的一個警告(感謝Servy)是高級類聲明的聲明,其中將一個類標記為SEALED。 密封的類基本上會鎖定該類,因此無法對其進行進一步的派生類。 這適用於整個類...屬性,方法,功能等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.