コマンドパターンを実装したい。私は次のものを持っています:
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());
}
それは期待どおりに機能します。私の問題は、State クラスを拡張したいときに始まります。
public class ExtendedState : State
{
public int Number2 { get; set; }
}
ここで、アクションは に変更を適用する必要がありますExtendedState
。ExtendedState
そこで、パラメーターとして受け取る 2 つの追加関数を持つ拡張アクションを作成すると考えました。
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;
}
}
インターフェイスを実装する関数が冗長になるため、これは私がすでに気に入っていないことです。さらに、IAction ではなく、新しい型を使用する新しいExecute
関数を myに作成する必要があります(そうしないと、実装されていない関数が呼び出されます)。ExtendedState
私はそれが素敵なオブジェクト指向の方法でできると確信しています。あなたは私を助けることができます?目的は、拡張可能な State クラスと IAction インターフェイスを作成することです (ジェネリックかもしれませんが、私にはわかりません) State
。