给出以下伪C#代码:
public abstract class Worker
{
public void DoWork()
{
Prepare();
Work();
Cleanup();
}
protected abstract void Work();
}
使用此设计,派生类(覆盖Work()
方法)可能会直接调用Work()
方法。
我正在寻找有关如何防止任何子类执行此调用的设计提示,或者至少生成编译器警告。
为什么我要这样做?
Worker实际上将Work()
发送到另一个线程。 DoWork()
负责锁定。
我知道,这很奇怪。 Work()
- 正文可能只包含对DoMyWork()
的方法调用,而对象可能会在其他位置调用DoMyWork()
。拦截它是不可能的。
反正。我很欣赏有关这个问题的任何想法。
答案 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()。