【问题标题】:Type constraint类型约束
【发布时间】:2012-09-06 19:32:27
【问题描述】:

我有以下类层次结构。

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 的类型,以确保ItemAItemB 分别是IEnumerable&lt;ItemA&gt;IEnumerable&lt;ItemB&gt;?有没有更好的设计?

【问题讨论】:

    标签: c# .net oop class generics


    【解决方案1】:

    你应该使用Generic Class

    【讨论】:

    • 我想到了使用泛型。但是,HeaderAHeaderB 添加了不同的成员。
    • 看carlosfigueira的帖子,可以的
    • 知道了。我在考虑 Darren 的回答中的设计。
    【解决方案2】:

    您可以更改 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 { }
    

    【讨论】:

    • 您是否也考虑添加约束where TItem : Item
    【解决方案3】:

    这样

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

    【讨论】:

      【解决方案4】:

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

      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)

      【讨论】:

      • 方法也不错。你认为约束where T : Item 会好吗?
      • @Jordão - 我刚刚添加了它。谢谢:-)
      • +1 如果不向基础添加任何内容,那么 OP 可能真的不需要创建 Header&lt;T&gt; 子类。
      【解决方案5】:

      如果我正确理解您的问题,您可以更改 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 集合中。

      【讨论】:

        猜你喜欢
        • 2017-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多