2012-04-16 91 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')中以这种方式进行强制转换,则实际上只是调用方法本身,并且会陷入无限循环。

或者,您可以重新考虑您的班级设计。 :-)

相关问题