Я хочу реализовать шаблон команды. У меня есть следующее:Реализация шаблона команды и полиморфизма
public class State
{
public int Number { get; set; }
public void Execute(IAction action)
{
if (action.IsValid(this))
action.Apply(this);
}
}
public interface IAction
{
bool IsValid(State state);
void Apply(State state);
}
public class ActionSet5IfZero : IAction
{
public bool IsValid(State state)
{
if (state.Number == 0)
return true;
else
return false;
}
public void Apply(State state)
{
state.Number = 5;
}
}
И программа:
static void Main(string[] args)
{
State s = new State();
s.Execute(new ActionSet5IfZero());
}
Это работает, как ожидалось. Моя проблема начинается, когда я хотел бы расширить государственный класс:
public class ExtendedState : State
{
public int Number2 { get; set; }
}
Теперь действие должно применить изменения на ExtendedState
. Так я думал, я хотел бы создать расширенное действие, которое имеет две дополнительные функции, которые принимают ExtendedState
в качестве параметра:
public class ExtendedActionSet5IfZero : IAction
{
public bool IsValid(State state)
{
throw new NotImplementedException();
}
public void Apply(State state)
{
throw new NotImplementedException();
}
public bool IsValid(ExtendedState state)
{
if (state.Number == 0 && state.Number2 == 0)
return true;
else
return false;
}
public void Apply(ExtendedState state)
{
state.Number = 5;
state.Number2 = 5;
}
}
Это то, что я уже не нравится потому, что функции, которые реализуют интерфейс становятся лишними. Кроме того, мне нужно создать новую функцию Execute
в моем ExtendedState
, которая использует новый тип, а не IAction (иначе вызываемые функции не вызываются).
Уверен, что это может быть сделано с хорошим способом OO. Можете ли вы мне помочь? Цель состоит в том, чтобы создать расширяемый класс State и интерфейс IAction (возможно, даже общий, я не знаю), поэтому я могу расширить State
, но остаюсь общей функциональностью без дополнительного кодирования.
Я пробовал это раньше. Проблема заключается в том, что я расширяю класс State и пытаюсь повторно использовать функцию Execute. Тип IAction не связан с IAction , и я получаю исключение. –