如果子类调用覆盖成员,则阻止/生成警告

时间:2016-03-29 14:05:11

标签: c# oop inheritance

给出以下伪C#代码:

public abstract class Worker
{
    public void DoWork()
    {
         Prepare();
         Work();
         Cleanup();
    }

    protected abstract void Work();
}

使用此设计,派生类(覆盖Work()方法)可能会直接调用Work()方法。

我正在寻找有关如何防止任何子类执行此调用的设计提示,或者至少生成编译器警告。

为什么我要这样做? Worker实际上将Work()发送到另一个线程。 DoWork()负责锁定。

我知道,这很奇怪。 Work() - 正文可能只包含对DoMyWork()的方法调用,而对象可能会在其他位置调用DoMyWork()。拦截它是不可能的。

反正。我很欣赏有关这个问题的任何想法。

3 个答案:

答案 0 :(得分:1)

感谢Eris和Corey,我想我已经明白了。这个怎么样:

public abstract class Worker
{
    public void DoWork()
    {
         if (Work != null)
         {
             Prepare();
             Work();
             Cleanup();
         }
    }

    protected Action Work { private get; set; }
}

public class ImplWorker {
    public ImplWorker() {
        Work = //whatever
    }
}

如果他真的想要将它存放在其他地方和东西中。但就我想象的那样。

答案 1 :(得分:0)

如果使用资源(例如远程服务器,数据库连接)完成工作,或者可以将其更改为类似,那么您可以这样做:

public interface IResource
{
}

public abstract class Worker
{
    private class TheResource : IResource
    {
        // implement
    }

    public void DoWork()
    {
        Prepare();

        var resObj = new TheResource();
        Work(resObj);
        // if needed, cleanup/dispose resObj here

        Cleanup();
    }

    protected abstract void Work(IResource resourceObj);
}

答案 2 :(得分:0)

这有点像黑客攻击,但您可以将方法更改为虚拟方法,添加调用新方法的主体,然后向其中添加ObsoleteAttribute

    protected void DoWork()
    {
        // New method
    }

    [Obsolete("This method is deprecated.")]
    protected virtual void Work()
    {
        DoWork();
    }

将方法标记为虚拟会阻止任何现有的子类中断,因为之前需要它们覆盖Work()。