类型约束

时间:2012-09-13 16:37:36

标签: c# .net oop class generics

我有以下类层次结构。

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 { .... }

是否可以对Item的类型进行编译时检查,以确保分别为IEnumerable<ItemA>IEnumerable<ItemB>确定ItemAItemB?有没有更好的设计?

5 个答案:

答案 0 :(得分:6)

您可以更改Header类的定义以将type参数传递给它,然后您可以强制执行:

    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 { }

答案 1 :(得分:2)

您应该使用Generic Class

答案 2 :(得分: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

答案 3 :(得分:1)

喜欢这个

class HeaderA : Header<ItemB> { .... }
class HeaderB : Header<ItemA> { .... }

答案 4 :(得分: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集合中。