我有回收收集和协方差的问题,我想知道是否有人有更好的解决方案.
场景是这样的:
我有2个版本的实现,我想保持版本实现完全分离(即使它们可能具有相同的逻辑).在实现中,我想返回一个项目列表,因此在界面中,我将返回该项目的接口列表.但是,在实际的接口实现中,我想返回该项的具体对象.在代码中,它看起来像这样.
interface IItem
{
// some properties here
}
interface IResult
{
IList<IItem> Items { get; }
}
Run Code Online (Sandbox Code Playgroud)
然后,将有2个名称空间具有这些接口的具体实现.例如,
命名空间版本1
class Item : IItem
class Result : IResult
{
public List<Item> Items
{
get { // get the list from somewhere }
}
IList<IItem> IResult.Items
{
get
{
// due to covariance, i have to convert it
return this.Items.ToList<IItem>();
}
}
}
Run Code Online (Sandbox Code Playgroud)
在命名空间Version2下会有另一个相同的实现.
要创建这些对象,将有一个工厂接受版本并根据需要创建适当的具体类型.
如果调用者知道确切的版本并执行以下操作,则代码可以正常工作
Version1.Result result = new Version1.Result();
result.Items.Add(//something);
Run Code Online (Sandbox Code Playgroud)
但是,我希望用户能够做到这样的事情.
IResult result = // create from …Run Code Online (Sandbox Code Playgroud)