好的,我一直在努力寻找做只读通用集合接口的最佳方法,这就是我想出的:
public delegate Boolean EnumerateItemsDelegate<ItemType>(ItemType item);
public delegate Boolean EnumerateItemsDelegate(Object item);
public interface IReadOnlyObjectCollection<out ItemType>
{
Boolean ContainsItem(Object item);
Array CopyToArray();
void EnumerateItems(EnumerateItemsDelegate enumerateItemsDelegate);
UInt32 Count { get; }
UInt32 Capacity { get; }
}
public interface IReadOnlyCollection<ItemType> : IReadOnlyObjectCollection<ItemType>
{
Boolean ContainsItem(ItemType item);
Array<ItemType> CopyToArray();
void EnumerateItems(EnumerateItemsDelegate<ItemType> enumerateItemsDelegate);
UInt32 Count { get; }
UInt32 Capacity { get; }
}
这旨在回避Microsoft集合接口的大问题...无法将派生的只读集合分配给基本集合。
IReadOnlyObjectCollection<String> s;
IReadOnlyObjectCollection<Object> o = s;
接口并不理想,因为你仍然需要使用'Object'而不是实际的类型,但我认为这是尽可能接近你没有编译时只有泛型。如果你们看到任何巨大的问题或缺点,我绝对会感激...