【发布时间】:2014-08-24 10:21:05
【问题描述】:
我有以下通用接口:
public interface IContainer<T>
以及充当这些通用接口容器的通用接口:
public interface IGroupOfContainers<TContainer, TValue>
where TContainer : IContainer<TValue>
现在我可以定义一些类了:
public class SomeContainer<T> : IContainer<T>
...
public class OtherContainer<T> : IContainer<T>
...
public class SomeGroupOfContainers<TContainer, TValue>
: IGroupOfContainers<TContainer, TValue>
where TContainer : IContainer<TValue>
...
public class OtherGroupOfContainers<TContainer, TValue>
: IGroupOfContainers<TContainer, TValue>
where TContainer : IContainer<TValue>
...
现在我希望IntGroupManager 能够处理任何符合IGroupOfContainers<IContainer<int>, int> 接口的对象:
public class IntGroupManager
{
public IGroupOfContainers<IContainer<int>, int> IntGroup { get; set; }
...
}
但是当我尝试时:
var manager= new IntGroupManager();
manager.IntGroup = new GroupOfContainers<Container<int>, int>
as IGroupOfContainers<IContainer<int>, int>;
我收到 “可疑演员表:没有从 GroupOfContainers<Container<int>, int> 和 IGroupOfContainers<IContainer<int>, int> 继承的类型”警告,当我尝试运行代码时,manager.IntGroup 已设置到null,因为演员表失败了。
如果我将IntGroup 属性的类型签名更改为
public IGroupOfContainers<Container<int>, int> IntGroup { get; set; }
(将IContainer更改为具体类Container),代码可以正常执行。但是,我将无法使用IntGroup 类型(例如GroupOfContainers<OtherContainer<int>, int>)实例化IntGroupManager 的实例,因为OtherContainer 不是从Container 派生的。
我可以在IntGroupManager的定义中引入泛型参数,或许可以重写为
public class IntGroupManager<TContainer> where TContainer : IContainer<int>
但是,这会将IntGroupManager 的任何实例绑定到IContainer 的特定类型;我做不到
var manager = new IntGroupManager<Container<int>>();
// Set manager.IntGroup and do some things with it
// This is okay
manager.IntGroup = new GroupOfContainers<Container<int>, int>();
// manager executes some code involving IntGroup and manipulates its internal state
// Set manager.IntGroup to something else and do things with it
// This is not okay, since OtherContainer<int> is not derived from Container<int>
manager.IntGroup = new GroupOfContainers<OtherContainer<int>, int>();
所以我失去了一些灵活性。
如何正确地将IntGroup 属性定义为符合IGroupOfContainers<IContainer<int>, int> 的任何类型?我希望能够将IntGroupManager 的同一个实例与任何符合IGroupOfContainers<IContainer<int>, int> 的IntGroup 对象一起使用。有没有办法做到这一点?
【问题讨论】:
标签: c# .net generics interface