从C#中的overriden类调用父方法

时间:2012-12-05 20:31:55

标签: 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)
    {
        // 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的方法而不是覆盖方法。

有没有办法以干净的方式执行此操作而无需复制/粘贴重复的代码?

2 个答案:

答案 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();
    }
}