0

我有以下代码:

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 的方法,而不是被覆盖的方法。

有没有办法在不复制/粘贴重复代码的情况下以干净的方式做到这一点?

4

2 回答 2

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
    }
}

通过将整个方法重构为私有方法,您提供了一种调用当前类的方法定义的方法,同时仍然为子类提供了一个虚拟方法来访问。

于 2012-12-05T22:09:33.187 回答
0

当您覆盖虚拟方法时,您无法在没有 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();
    }
}
于 2012-12-05T21:08:41.463 回答