問題:
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
両方を継承する(および、明示的なインターフェイスとして実装されたとを実装する)も定義したいという事実に起因します。また、を非表示にして、を表示するだけにします。(「問題」のセクションに含まれているのは、実際にはこの後のはずですが、最初に置く方がはるかに読みやすいと思いました)。IState
IHasStateList
ITask
IHasTaskList
IHasTaskList
Tasks
IHasStateList
States
(pff..long text)ありがとう!