问题:
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
属性。
问题来自这样一个事实,即我还想定义 a StatesChain
,它继承自IState
and IHasStateList
(并且它也实现ITask
and IHasTaskList
,实现为显式接口)并且我希望它也隐藏IHasTaskList
'sTasks
并且只显示IHasStateList
's States
。(“问题”部分中包含的内容应该在此之后,但我认为把它放在第一位会更便于读者阅读)。
(pff..长文本)谢谢!