如何在不创建对象的情况下调用父类方法
问题描述:
我可以通过使用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
}
}
答
您无法选择使用base
语法运行的衍生方法的版本。运行特定方法的唯一方法是实例化C
内的A
版本,该版本可用于该方法(基本上,实际实例A
)。
但我个人不会这样做。这表明您的继承链存在设计问题。
如果您需要确保C
运行A
,为什么不从C
继承A
- C : A
。
答
你不能。使用base.MethodName将始终调用层次结构中最接近的实现,如果没有明确声明可以调用的方法,则无法通过此方法
还值得注意的是,如果发现自己处于您希望的状态要做到这一点,你有一个设计缺陷。
答
如果您需要在父母的不直接给孩子一些家长的功能,那么你应该将这个功能分离方法:
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
- 改变继承顺序,即
B
从C
- 提取这种行为
答
您已经创建的实例其他物体,通过创建一个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')中以这种方式进行强制转换,则实际上只是调用方法本身,并且会陷入无限循环。
或者,您可以重新考虑您的班级设计。 :-)
如果你需要这样做,你需要重构这个可能性。你似乎有你的继承模型和你想要的行为之间的不匹配 – Pete 2012-04-16 12:13:55
重复 - http://*.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
如果你真的想这样做,也许你应该考虑改变你的设计...... – 2012-04-16 12:15:31