强制程序员调用其基中的方法
本文关键字:方法 程序员 调用 | 更新日期: 2023-09-27 18:10:24
我构建了一个异步任务服务执行器,通过外部请求执行任务。
每个任务都包含函数void run(),
,所以任何想要向系统添加任务的程序员都需要继承BaseTask
。
interface ITask{
void run();
}
abstract BaseTask : ITask{
//force "run()" to set Result
public ResultContainer Result {set; get;}
void run();
}
class SomeTask : BaseTask {
void run(){
////run the operation here, in the end, set the result.
//force the programmer to set the Result;
this.Result = new ResultContainer("task ok");
}
}
由于内部原因,run()
必须为空。
是否有任何方法,我可以强迫程序员谁想要添加一个任务调用Result
在BaseTask
和设置其值?你认为这是一种不好的做法吗?
谢谢
是的,这是要避免的。像这样的规则应该在可能和实际的情况下由编译器强制执行(而不是约定)。
在您的情况下,您应该这样做:
public abstract class BaseTask
{
public void Run()
{
Result = RunInternal();
}
public ResultContainer Result { get; set; }
protected abstract ResultContainer RunInternal();
}
这将在语义上完成您想要的(外部调用Run
函数将总是导致设置Result
属性),并且它强制从BaseTask
继承的开发人员提供正在使用的值。唯一的区别是它们将覆盖(或者更确切地说,实现)RunInternal
函数而不是Run
。
我不确定这是否适合一些预先想象的设计模式,但是您是否可以为BaseTask
添加另一种具有返回值的方法,并让开发人员实现它?例如(抱歉,如果代码不是100%正确,在VS中不这样做):
interface ITask{
void run();
}
abstract BaseTask : ITask{
//force "run()" to set Result
public ResultContainer Result{set;get;}
void run() {
Result = runInternal();
}
protected abstract ResultContainer runInternal();
}
class SomeTask : BaseTask {
protected override ResultContainer runInternal(){
return new ResultContainer("task ok");
}
}