【问题标题】:Classes with Collections as Properties vs. Classes Inheriting Collections将集合作为属性的类与继承集合的类
【发布时间】:2010-09-25 21:08:38
【问题描述】:

最近我使用了一个从集合继承的类,而不是在类中实例化集合,这是可以接受的,还是会在以后产生看不见的问题?为了清楚起见,以下示例:

public class Cars : List<aCar>

而不是类似的东西:

public class Cars
{
 List<aCar> CarList = new List<aCar>();
}

有什么想法吗?

【问题讨论】:

    标签: c# class inheritance


    【解决方案1】:

    真的需要“汽车”课程吗? 有比“列表”更多的功能吗?如果没有,您应该使用“List”(或更好的“IList”)。

    如果“汽车”类有任何附加功能,主要有两种情况:

    • 这个类是“final”类,可能性不大,其他人需要扩展它。那么这个结构可以吗。
    • 这个类可能会被用作基类。那么我推荐使用这种结构:

    .

    public class CarList<T> : List<T> where T : Car {
        // some added functionality
    }
    

    如果你以后想要更灵活,你应该使用组合:

    public class CarList<T> : IList<T> where T : Car {
        private IList<T> innerList;
        public CarList() { this.innerList = new List<T>(); }
    
        // implementation of IList<T>
    
        // some added functionality
    }
    

    【讨论】:

      【解决方案2】:

      如果该类的目的是为标准集合添加附加功能,那么我将从该集合继承。如果收藏只是更大图景的一部分,那听起来更像是一种财产。

      但是,除非您确实需要 List 中的功能,否则我会考虑使用 Collection 而不是 List

      【讨论】:

        【解决方案3】:

        如果你想让你的 Cars 类表现得像一个 List 并且拥有相同的方法,那也不错。你只是从中派生出来,你就完成了。然后,如果您想添加任何其他功能,只需声明这些方法即可。但是,您现在已绑定到 List,如果 List 以任何不合需要的方式更改,您就完蛋了。

        当您改为将其设为复合类并在类中实例化 List 时,您只需要公开您想要公开的 List 方法。但这意味着你也必须重复它们。

        【讨论】:

          【解决方案4】:

          我之前看错了这个问题。

          我建议使用组合而不是继承。如果您希望能够使用所有时髦的 LINQ 东西,请务必实现 IEnumerable&lt;T&gt; 甚至可能是 IList&lt;T&gt; - 但我不会直接从 List&lt;T&gt; 派生。

          如果您确实想“免费”获得收藏品但仍保留控制权,您可以使用CollectionBase。这仍然会限制您在继承方面的一次尝试,但至少您可以更好地控制集合中发生的事情。

          【讨论】:

            【解决方案5】:

            这取决于课程的最终目的。如果它仅作为您自己的集合实现工作,请使用继承。如果没有,请包含一个集合作为属性。第二种选择更通用:

            • 由于您只能从一个类继承,您可能需要从另一个类而不是集合继承
            • 如果您需要将此类视为一个集合,您可以包含一个索引器属性。

            【讨论】:

              【解决方案6】:

              这样做的问题是您的 Cars 类仍然具有从 List 继承的接口,这可能会允许您不想要的操作。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-07-03
                • 2015-08-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多