首页 > 解决方案 > 将行为添加到相互调用的重写重载

问题描述

假设我正在使用具有非密封类的库。我知道类的接口,但不知道它的实现。有点像这样:

public class LibraryClass
{
    public virtual void DoStuff()
    {
        //Unknown implementation
    }

    public virtual void DoStuff(int value)
    {
        //Unknown implementation
    }
}

我想使用这个类,但将我自己的行为添加到每个DoStuff重载的调用中。一个显然天真的方法是:

public class MyClass : LibraryClass
{
    public override void DoStuff()
    {
        Console.WriteLine("Called");
        base.DoStuff();
    }

    public override void DoStuff(int value)
    {
        Console.WriteLine("Called");
        base.DoStuff(value);
    }
}

乍一看,它看起来不错,但如果我DoStuff()从我的班级打电话,我会看到输出“Called”两次。似乎LibraryClass.DoStuff()(我只能猜测)的实际实现必须与此类似:

public virtual void DoStuff()
{
    DoStuff(0);
}

由于DoStuff(int)被覆盖,这最终会调用我自己的实现,因此添加的行为最终会被调用两次。

解决此问题的一种方法是仅覆盖DoStuff(int),因为无论哪种方式都会调用它,但无法确保此库的某些未来版本不会更改DoStuff()调用DoStuff(int)

我也可以做一些复杂的事情,比如:

public class MyClass : LibraryClass
{
    private bool isInCall = false;

    public override void DoStuff()
    {
        if (!isInCall)
        {
            Console.WriteLine("Called");
        }

        isInCall = true;

        base.DoStuff();

        isInCall = false;
    }

    public override void DoStuff(int value)
    {
        if (!isInCall)
        {
            Console.WriteLine("Called");
        }

        isInCall = true;

        base.DoStuff(value);

        isInCall = false;
    }
}

但这似乎有点草率。

有没有更优雅的方法来覆盖所有重载,但确保我添加的代码只执行一次?

标签: c#overridingoverloading

解决方案


推荐阅读