実際にタスクを Process に直接埋め込む代わりに、タスクにファクトリを使用することもできます。その最も単純な形式はデリゲートです。
public class Process {
private readonly List<Func<Process, BaseTask>> TaskFactories
= new List<Func<Process, BaseTask>>();
public RegisterTask(Func<Process, BaseTask> taskFactory)
{
TaskFactories.Add(taskFactory);
}
public IEnumerable<Task> CreateTasks() {
return TaskFactories.Select(f => f(this)).ToArray();
//ToArray used to ensure all tasks created here and now.
}
}
そのため、次のようなタスクを作成できます。
public class MyTask : BaseTask {
public MyTask(Process p) {
/* grab parameters from process here */
}
}
そして、次のProcess p
ように指定すると、このタスクを登録できます。
public void RegisterSomeTask(Process p) {
p.RegisterTask((process) => new MyTask(p));
}
これにより、メソッドの必要性もなくなりますInitialize
。これは、状態管理が完全にうまくいかない限り、エラーを発生させる可能性のある初期化されていないタスクを持つ可能性があるため、私の意見では決して理想的なパターンではありません。