問題:
class StatesChain : IState, IHasStateList {
private TasksChain tasks = new TasksChain();
...
public IList<IState> States {
get { return _taskChain.Tasks; }
}
IList<ITask> IHasTasksCollection.Tasks {
get { return _taskChain.Tasks; } <-- ERROR! You can't do this in C#!
I want to return an IList<ITask> from
an IList<IStates>.
}
}
返されたものが読み取り専用であると仮定するとIList、私が達成しようとしていることは安全であることがわかります(またはそうではありませんか?)。私がしようとしていることを達成する方法はありますか?TasksChainエラーが発生しやすく、コードの重複につながるため、アルゴリズムを自分で実装しようとはしません(もう一度!)。たぶん、抽象的なチェーンを定義して、そこから両方TasksChainを実装することができますStatesChainか?または多分Chain<T>クラスを実装しますか?
この状況にどのようにアプローチしますか?
詳細:ITaskインターフェース
を定義しました:
public interface ITask {
bool Run();
ITask FailureTask { get; }
}
およびIStateから継承するインターフェイスITask:
public interface IState : ITask {
IState FailureState { get; }
}
IHasTasksListインターフェイスも定義しました。
interface IHasTasksList {
List<Tasks> Tasks { get; }
}
とIHasStatesList:
interface IHasTasksList {
List<Tasks> States { get; }
}
ここで、を定義しましたTasksChain。これは、一連のタスクを操作するコードロジックを持つクラスです(TasksChainそれ自体が一種のITask!であることに注意してください)。
class TasksChain : ITask, IHasTasksList {
IList<ITask> tasks = new List<ITask>();
...
public List<ITask> Tasks { get { return _tasks; } }
...
}
私はState次の方法を実装しています:
public class State : IState {
private readonly TaskChain _taskChain = new TaskChain();
public State(Precondition precondition, Execution execution) {
_taskChain.Tasks.Add(precondition);
_taskChain.Tasks.Add(execution);
}
public bool Run() {
return _taskChain.Run();
}
public IState FailureState {
get { return (IState)_taskChain.Tasks[0].FailureTask; }
}
ITask ITask.FailureTask {
get { return FailureState; }
}
}
ご覧のとおり、これは明示的なインターフェイス実装を利用して「非表示」FailureTaskにし、代わりにFailureStateプロパティを表示します。
問題は、とのStatesChain両方を継承する(および、明示的なインターフェイスとして実装されたとを実装する)も定義したいという事実に起因します。また、を非表示にして、を表示するだけにします。(「問題」のセクションに含まれているのは、実際にはこの後のはずですが、最初に置く方がはるかに読みやすいと思いました)。IStateIHasStateListITaskIHasTaskListIHasTaskListTasksIHasStateListStates
(pff..long text)ありがとう!