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-我不确定你在说什么,因为这里没有虚拟方法。无论如何,我认为重构以避免隐藏是一个更好的解决方案。