【发布时间】:2010-04-26 23:31:06
【问题描述】:
问题:
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; }
}
还有一个继承自ITask 的IState 接口:
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..长文本)谢谢!
【问题讨论】:
标签: c# generics oop generic-variance