Я пытаюсь создать дизайн для какого-то интерфейса IExecutable. Не буду вдаваться в подробности, но дело в том, что у меня есть несколько действий, которые нужно выполнить из базового класса. Они могут принимать разные параметры (ничего страшного) и могут возвращать/не возвращать значение.
Пока это мой дизайн:
public abstract class ActionBase
{
// ... snip ...
}
public abstract class ActionWithResultBase<T>: ActionBase
{
public abstract T Execute();
}
public abstract class ActionWithoutResultBase: ActionBase
{
public abstract void Execute();
}
До сих пор каждое из моих конкретных действий должно быть потомком либо из базы ActionWithResultBase, либо из базы ActionWithoutResult, но мне это очень не нравится. Если бы я мог переместить определение Execute в ActionBase, учитывая, что конкретный класс может возвращать или не возвращать значение, я бы достиг своей цели.
Кто-то сказал мне, что это можно сделать с помощью Func и Action, с чем я полностью согласен, но я не могу найти способ объединить это в один класс, чтобы вызывающая сторона знала, будет ли действие возвращать значение или нет.
Кратко: я хочу сделать что-то вроде:
// Action1.Execute() returns something.
var a = new Action1();
var result = a.Execute();
// Action2.Execute() returns nothing.
var b = new Action2();
b.Execute();