强制程序员调用其基中的方法

本文关键字:方法 程序员 调用 | 更新日期: 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()必须为空。

是否有任何方法,我可以强迫程序员谁想要添加一个任务调用ResultBaseTask和设置其值?你认为这是一种不好的做法吗?

谢谢

强制程序员调用其基中的方法

是的,这是要避免的。像这样的规则应该在可能和实际的情况下由编译器强制执行(而不是约定)。

在您的情况下,您应该这样做:

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");
   }
}