簡體   English   中英

沒有“ virtual”關鍵字的C#中的多級繼承

[英]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方法,因為按定義它已經是虛擬的

虛擬的(C#參考)

備注

調用虛擬方法時,將檢查對象的運行時類型是否有重寫成員。 如果沒有派生類重寫該成員,則將調用最派生類中的重寫成員,該成員可能是原始成員。

默認情況下,方法是非虛擬的。 您不能覆蓋非虛擬方法。

您不能將虛擬修飾符與靜態,抽象,私有或替代修飾符一起使用。


如果這樣做,則會出現令人討厭的編譯時錯誤

編譯器錯誤CS0113

標記為替代的成員“功能”不能標記為新成員或虛擬成員

用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM