我希望有一个接口,该接口可以保留通用类型类的对象。以下是一些代码和更多说明:
public interface IItem { }
public interface IClass1<T> : IEnumerable<T> { }
public class Item1 : IItem { }
public class Item2 : IItem { }
public class Class1<T> : IClass1<T> where T : class, IItem { }
public class Class2<T> : IClass1<T> where T : class, IItem { }
public class Class : UserControl
{
IClass1<IItem> _item;
public virtual IClass1<IItem> item
{
get
{
return _item;
}
set
{
_item = value;
//then do something...
}
}
public Class2()
{
//few examples what I would like to do
item = new Class1<Item1>();
item = new Class1<Item2>();
item = new Class2<Item1>();
item = new Class2<Item2>();
}
}
问题是,Class2将作为继承类的基础,我只知道,字段_item将保持实现某种通用接口的类的对象(接口从IEnumerable继承,因此必须是通用的),我不知道我如何强制字段项目接受实现此接口的类的对象(而它们的通用类型可以是Item1,Item2等,但是它们都实现IItem接口)
这是将您的类重新定义为更易于理解的内容:
public interface IFruit { }
public interface ICollectionOfFruit<T> : IEnumerable<T> { }
public class Apple : IFruit { }
public class Banana : IFruit { }
public class BoxOfFruit<T> : ICollectionOfFruit<T> where T : class, IFruit { public IEnumerator<T> GetEnumerator() { throw new NotImplementedException(); } IEnumerator IEnumerable.GetEnumerator() { throw new NotImplementedException(); } }
public class BagOfFruit<T> : ICollectionOfFruit<T> where T : class, IFruit { public IEnumerator<T> GetEnumerator() { throw new NotImplementedException(); } IEnumerator IEnumerable.GetEnumerator() { throw new NotImplementedException(); } }
public class Class
{
ICollectionOfFruit<IFruit> _item;
public Class()
{
//few examples what I would like to do
_item = new BoxOfFruit<Apple>();
_item = new BoxOfFruit<Banana>();
_item = new BagOfFruit<Apple>();
_item = new BagOfFruit<Banana>();
}
}
你需要了解的是,即使Apple
继承(实现),IFruit
那么ICollectionOfFruit<Apple>
不继承ICollectionOfFruit<IFruit>
如果ICollectionOfFruit<T>
继承,IList<T>
则强制转换BoxOfFruit<Apple>
为ICollectionOfFruit<IFruit>
将允许您向Banana
集合添加一个。那会在运行时爆炸。
但是,在您的情况下,ICollectionOfFruit<T>
继承自,IEnumerable<T>
因此您可以进行一个简单的更改以使代码正常工作:
public interface ICollectionOfFruit<out T> : IEnumerable<T> { }
由于out
它意味着您将永远不会尝试将其放入in
收藏夹IFruit
,因此允许强制转换是安全的。
但是,如果您的实际用例允许ICollectionOfFruit<T>
将aT
作为方法的输入,则不能使用out
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句