C# 从C中重写的类调用父方法#
我有以下代码:C# 从C中重写的类调用父方法#,c#,oop,inheritance,C#,Oop,Inheritance,我有以下代码: 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) { /
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的方法,而不是重写的方法
有没有一种方法可以在不复制/粘贴重复代码的情况下以干净的方式执行此操作?当重写虚拟方法时,如果没有base关键字,则无法调用它,因此无法从该类调用if。您可以尝试使用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();
}
}
可以这样修改基类:
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
}
}
通过将整个方法重构为私有方法,您可以提供一种方法来调用当前类的方法定义,同时还可以提供一个虚拟方法供子类访问。当我运行代码时,它工作正常——没有堆栈溢出。你确定你粘贴了你真正运行的代码吗?@Jon B这是我的类的一个表示。下面是完整的代码:我不想粘贴它,因为它太长了,我已经发现了问题。我只想知道如何从基类调用重写的方法。调用重写的方法不需要什么魔法。只需像平常一样调用该方法。试试看!这不是我的问题,我想从基类调用重写的方法。当我从基类调用该方法时,它调用被重写的方法,而不是基类方法(我要调用的方法)@Nick Bray我不能从ClassA调用base.DoSomething(),因为ClassA是基类。这里的问题是基类不能保证没有子类重写该方法(除非方法不是虚拟的)。@Servy-我不确定你在说什么,因为这里没有虚拟方法。无论如何,我认为重构以避免隐藏是一个更好的解决方案。