3

我有以下类层次结构。

class Header { IEnumerable<Item> Item { get; set; } .... }
class HeaderA : Header { .... } // Item should have the type of IEnumerable<ItemA>
class HeaderB : Header { .... } // Item should have the type of IEnumerable<ItemB>

class Item { .... }
class ItemA : Item { .... }
class ItemB : Item { .... }

是否可以在编译时检查 of 的类型Item以确保它分别是IEnumerable<ItemA>IEnumerable<ItemB>forItemAItemB?有没有更好的设计?

4

5 回答 5

6

您可以更改 Header 类的定义以将类型参数传递给它,然后您可以强加:

    class Header<TItem> where TItem : Item { IEnumerable<TItem> Item { get; set; } }
    class HeaderA : Header<ItemA> { } // Item should have the type of IEnumerable<ItemA>
    class HeaderB : Header<ItemB> { } // Item should have the type of IEnumerable<ItemB>

    class Item { }
    class ItemA : Item { }
    class ItemB : Item { }
于 2012-09-13T16:41:50.643 回答
2

您应该使用通用类

于 2012-09-13T16:40:19.117 回答
2

您可以使用泛型类型并将其传递给类。

public class Header<T> where T : Item
{
   IEnumerable<T> Item { get; set; }
}


 Header<ItemA> AHeader;
 Header<ItemB> BHeader;

http://msdn.microsoft.com/en-US/library/sz6zd40f(v=vs.100 )

于 2012-09-13T16:44:12.283 回答
1

像这样

class HeaderA : Header<ItemB> { .... }
class HeaderB : Header<ItemA> { .... }
于 2012-09-13T16:43:11.723 回答
0

如果我正确理解您的问题,您可以更改 Header 类的签名来完成此操作。

class Header<ItemType> { IEnumerable<ItemType> Item {get; set;} ....}
class HeaderA : Header<ItemA> { .... }
class HeaderB : Header<ItemB> { .... }

class Item { .... }
class ItemA : Item { .... }
class ItemB : Item { .... }

将导致 HeaderA 仅允许 ItemA 对象,而 HeaderB 仅允许将 ItemB 对象放入其各自的 Item 集合中。

于 2012-09-13T16:45:41.807 回答