2012-04-16 90 views
1

我可以通過使用base.virtualParentMethod()來調用父類方法。但是,在下面的場景中,我如何在父 - 父類中調用方法而不創建它的對象。如何在不創建對象的情況下調用父類方法

class A 
    { 
     public virtual void virtualParentMethod() 
     { 
      Console.WriteLine("A"); 
     } 
    } 
    class B : A 
    { 
     public override void virtualParentMethod() 
     { 
      Console.WriteLine("B"); 
     } 
    } 
    class C : B 
    { 
     public override void virtualParentMethod() 
     { 
      //base.virtualParentMethod(); 
      //This is where I want to invoke the method of A 
      //So that out Will be : A 
     } 
    } 
+0

如果你需要這樣做,你需要重構這個可能性。你似乎有你的繼承模型和你想要的行爲之間的不匹配 – Pete 2012-04-16 12:13:55

+0

重複 - http://stackoverflow.com/questions/438939/is-there-any-way-to-call-the-parent-version-of-an -overridden-method-c-net – scibuff 2012-04-16 12:14:43

+0

如果你真的想這樣做,也許你應該考慮改變你的設計...... – 2012-04-16 12:15:31

回答

2

您無法選擇使用base語法運行的衍生方法的版本。運行特定方法的唯一方法是實例化C內的A版本,該版本可用於該方法(基本上,實際實例A)。

但我個人不會這樣做。這表明您的繼承鏈存在設計問題。

如果您需要確保C運行A,爲什麼不從C繼承A - C : A

0

您根本就不能,因爲這是Virtual Method Table,所以virtual關鍵字及其覆蓋的本質。調用方法的地址將從相應的real類型虛擬方法表中查找。

0

你不能。使用base.MethodName將始終調用層次結構中最接近的實現,如果沒有明確聲明可以調用的方法,則無法通過此方法

還值得注意的是,如果發現自己處於您希望的狀態要做到這一點,你有一個設計缺陷。

4

如果您需要在父母的不直接給孩子一些家長的功能,那麼你應該將這個功能分離方法:

class A 
{ 
    public virtual void VirtualParentMethod() 
    { 
     Foo(); 
    } 

    protected void Foo() 
    { 
     Console.WriteLine("A"); 
    } 
} 
class B : A 
{ 
    public override void VirtualParentMethod() 
    { 
     Console.WriteLine("B"); 
    } 
} 
class C : B 
{ 
    public override void VirtualParentMethod() 
    {   
     Foo(); 
    } 
} 

UPDATE

還認爲:

  • 繼承C直接從A
  • 改變繼承順序,即BC
  • 提取這種行爲
0

您已經創建的實例其他物體,通過創建一個C的實例(如C:B,B:A),所以還有一種方法你可以做一個小的修改。現在,沒有表明這是否是一個好主意;

如果您在派生方法實現中使用'new'關鍵字而不是覆蓋,那麼您可以直接調用方法的基本實現,繞過中間類實現,通過將對象強制轉換爲您希望實現的類型像這樣使用;

class A 
{ 
    public virtual void virtualParentMethod() 
    { 
     Console.WriteLine("A"); 
    } 
} 
class B : A 
{ 
    public new void virtualParentMethod() 
    { 
     Console.WriteLine("B"); 
    } 
} 
class C : B 
{ 
    public new void virtualParentMethod() 
    { 
     // casting this to A will allow you to call the base class implementation 
     ((A)this).virtualParentMethod(); 
    } 
} 

請注意,如果你做這個變化,你已經引入了行爲改變的方法的任何來電,這取決於它們如何引用的對象。如果您嘗試在現有的C.virtualParentMethod實現(聲明'override')中以這種方式進行強制轉換,則實際上只是調用方法本身,並且會陷入無限循環。

或者,您可以重新考慮您的班級設計。 :-)

相關問題