2015-04-19 68 views
0

我希望能夠按派生順序調用重寫方法。C# - 按繼承順序調用派生類中的重寫方法

例如在下面的代碼創建一個名爲CallMeThird新類,並調用它的CallMe方法時,我想它執行的基類中繼承的順序CallMe方法:

  • CallMeFirst
  • CallMeSecond
  • CallMeThird

There有一對夫婦的事情,我想避免,但:

  • 調用在派生類
  • 作爲CallMe採用OnCallMeFirstOnCallMeSecond仍暴露在派生類和代碼可能會變得混亂base.CallMe

是否有一個很好的,乾淨的模式,我可以用於這種情況?

using System; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Base b = new CallMeThird(); 
      b.CallMe(); 

      while (Console.ReadKey().Key != ConsoleKey.Escape) 
      { 

      } 
     } 
    } 

    public abstract class Base 
    { 
     public abstract void CallMe(); 
    } 

    public class CallMeFirst : Base 
    { 
     public override void CallMe() 
     { 
      Console.WriteLine("I would like to be called first"); 
     } 
    } 

    public class CallMeSecond : CallMeFirst 
    { 
     public override void CallMe() 
     { 
      Console.WriteLine("I would like to be called second"); 
     } 
    } 

    public class CallMeThird : CallMeSecond 
    { 
     public override void CallMe() 
     { 
      Console.WriteLine("I would like to be called third"); 
     } 
    } 
} 
+0

責任鏈,也許。真的不能說給這個小小的信息。 –

回答

1

base.CallMe();添加到每個覆蓋,這樣就會鏈接您的繼承層次結構。

你可以想要避免它所有你喜歡的,但它是解決方案。重寫意味着替換,如果你想使用父類的實現,你最好叫它。

但是,我沒有看到這裏需要繼承。如果CallMeThird只使用CallMeSecond(依此類推),而不需要與其互換,I would prefer composition。這意味着CallMeThird將包含CallMeSecond並將呼叫返回給它的CallMe方法。這個例子是剝離下來,以知道你的問題是一個組合或繼承問題,但是。

+1

我認爲這可能是唯一真正理智的解決方案。除非出現新的模式,否則會這樣做。 – user1423893

1

正如Nathan指出的那樣,通過base來調用的能力是爲了做到這一點,它可能是實現你想要的最簡單,最清潔,最高效和最穩定的方式。因此,除非您有要求,否則我會建議不要使用avoiding the feature that exists specifically to solve your problem

但是,如果你真的確認你要避免以任何理由,這裏是一個可能的選擇:

  1. 避免多態性(讓這些方法非虛)。
  2. 定義一個自定義屬性。
  3. 在每個具有該屬性的類中裝飾所需的方法。
  4. 在基類中的方法中,使用反射構建繼承鏈(從基類直到實際的對象類)。
  5. 對於鏈中的每個類型,請選擇用您的屬性裝飾的方法。
  6. 對於生成的方法序列,請按所需順序調用每個方法。
+1

所以總結一下:這裏有一段繩子可以讓你自己掛上; D –

+0

@NathanCooper當你這樣做時,我不會說你自己掛了。許多框架做類似的事情,如果做得對,它可以正常工作。然而,它並不像「base」調用那樣快速或容易,而且您必須定義當層次結構不符合您的期望時發生的情況。 –

相關問題