2013-06-19 178 views
4

我有這樣的:調用從派生派生類的父類方法

public class Base { 
    public virtual void Connect() 
    { 
     // do stuff 
    } 
} 

public class Derived1 : Base { 
    public override void Connect() 
    { 
     base.Connect(); 
     // do other stuff 
    } 
} 

public class Derived2 : Derived { 
    public override void Connect() 
    { 
     base.Connect() // Here I want to call Base::Connect(), not Derived::Connect() 
    } 
} 

有沒有一種方法,我可以打電話從Derived2的基地::連接,因爲我想跳過「做其他的東西」的一部分來自Derived1 :: Connect()?

編輯:它是強制性的,我派生自Derived1。

+0

我從來沒有試圖做這樣的事情,但你有沒有試過'base.base.Connect()'? – Nolonar

+0

是:)不起作用 – Kobe

+0

你可以改變'Base'或'Derived1'嗎? –

回答

3

喲可以嘗試拆分連接到兩個功能,並呼籲所有派生類,在需要的地方DoConnect

public class Base { 
    public virtual void Connect() 
    { 
     DoConnect(); 
    } 

    protected void DoConnect() 
    { 
     // do stuff 
    } 
} 

... 

public class Derived2 : Derived1 { 
    public override void Connect() 
    { 
     DoConnect(); 
     ... 
    } 
} 

如果您不能更新的基類,你可以在Derived1

做到這一點分裂
public class Derived1 : Base { 
    public virtual void Connect() 
    { 
     DoConnect(); 
    } 

    protected void DoConnect() 
    { 
     base.Connect(); 
    } 
} 
+0

我知道代碼是壞的,但因爲我無法改變太多,所以您的解決方案就是我所需要的。 – Kobe

1

C#不提供直接撥打base.base.method()的方法,您需要先更改設計。
請檢查答案why-c-sharp-doesnt-support-base-base

所以你需要改變你的設計一點點小技巧或解決方法。

  1. Derived1類,它的唯一的工作就是打電話base.Connect()
  2. 然後在您的Derived2()類定義Connect()那樣一來,只需調用在上一步中定義的前一個函數定義的新方法。

檢查這個例子:

public class Base { 
    public virtual void Connect() { 
     // do stuff 
    } 
} 

public class Derived1: Base { 
    public override void Connect() { 
     base.Connect(); 
     // do other stuff 
    } 
    public void CallBaseConnnect() { 
     //here make only one call to base.Connect(). 
     //that's how class Derived1 'll provide you away to call base.Connect(). 
     base.Connect(); 
    } 
} 

public class Derived2: Derived { 
    public override void Connect() { 
     //here just make a call to CallBaseConnnect() in base class Derived1 
     //that 'll equivalent to base.base.Connect. 
     base.CallBaseConnnect(); 
    } 
} 
+0

是的,那是我的正確方法。 – Kobe

+0

@vBx我用例子更新了我的答案 –