我有以下代码:
class ClassA
{
public virtual void DoSomething()
{
DoSomething(1); // when called from ClassB, it calls DoSomething from ClassA with an infinite recursion
}
public virtual void DoSomething(int someInt)
{
// do something
}
}
class ClassB : ClassA
{
public override void DoSomething()
{
DoSomething(1);
}
public override void DoSomething(int someInt)
{
base.DoSomething(someInt);
// do something
}
}
class Program
{
void someMethod()
{
ClassB instance = new ClassB();
instance.DoSomething(); // stack overflow caused by infinite recursion
}
}
我的问题是,当我调用ClassB.DoSomething();
并调用base.DoSomething(someInt);
时,我希望派生ClassB的父类调用ClassA的方法而不是覆盖方法。
有没有办法以干净的方式执行此操作而无需复制/粘贴重复的代码?
答案 0 :(得分:2)
您可以像这样修改基类:
class ClassA
{
public virtual void DoSomething()
{
DoSomethingHelper(1); // when called from ClassB, it calls DoSomething from ClassA with an infinite recursion
}
public virtual void DoSomething(int someInt)
{
DoSomethingHelper(someInt);
}
private void DoSomethingHelper(int someInt)
{
// do something
}
}
通过将整个方法重构为私有方法,您可以提供一种方法来调用当前类的方法定义,同时仍然为子类提供虚拟方法来访问。
答案 1 :(得分:0)
当您覆盖虚拟方法时,如果没有base关键字,则无法调用它,因此您无法从该类调用。您可以尝试使用Jon B所说的内容并使用方法阴影而不是覆盖。
class ClassA
{
public void DoSomething()
{
DoSomething(1);
}
public void DoSomething(int someInt)
{
Console.WriteLine("a");
}
}
class ClassB : ClassA
{
public new void DoSomething()
{
DoSomething(1);
}
public new void DoSomething(int someInt)
{
base.DoSomething();
}
}