2012-12-05 87 views
3

我知道這是糟糕的設計,我只是懶得修改代碼,我寧願選擇一個快捷方式。有沒有辦法在C中調用超級超級#

class Grandma 
{ 
    public virtual void Mtd(){} 
} 

class Mommy : Grandma 
{ 
    public override void Mtd(){ base.Mtd(); /* other stuff I wanna skip*/} 
} 

class Daughter : Mommy 
{ 
    public override void Mtd(){ /*base.base.Mtd() //How can I do it ? */} 
} 

因爲該方法是虛擬upcast不起作用。那麼,這甚至可能嗎?

+0

可能重複【如何調用base.base.method()?](HTTP://計算器.com/questions/2323401/how-to-call-base-base-method) –

回答

3

不可能'跳過'覆蓋。 你必須以某種方式重構它。

4

這是不可能的;但是,如果你想走捷徑,你可以只添加Mommy方法中的類型檢查:

class Mommy : Grandma 
{ 
    public override void Mtd() 
    { 
     base.Mtd(); // calls `Grandma` implementation 

     if (this.GetType() == typeof(Mommy)) 
     { 
      // not executed for any derived class 
     } 

     if (!(this is Daughter)) 
     { 
      // not executed for `Daughter` 
     } 
    }   
} 

class Daughter : Mommy 
{ 
    public override void Mtd() 
    { 
     base.Mtd(); // calls `Mommy` implementation 
    } 
} 
+1

但是,這會讓媽媽班與女兒班緊密結合,我認爲這是不好的做法;) – Need4Steed

+0

我已經添加了一個替代檢查'this.GetType()== typeof(Mommy)'這會排除所有派生類,而不僅僅是'女兒'。當然,按照你的要求,這仍然是一個「黑客」。正確的解決方案可能是重構你的代碼(通過引入一個布爾參數,或通過拆分方法層次結構)。 – Douglas