Проблема:
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
1054 * и показывал только IHasStateList
1056 *. (То, что содержится в разделе «Проблема», действительно должно быть после этого, но я подумал, что поставить его на первое место будет гораздо удобнее для читателей).
(пф .. длинный текст) Спасибо!