C# 业务对象集合是否应从集合继承<;T>;当它没有';你不能延长吗?

C# 业务对象集合是否应从集合继承<;T>;当它没有';你不能延长吗?,c#,inheritance,oop,C#,Inheritance,Oop,我有一个业务对象集合(表示数据库中的数据),该集合继承自集合,并有一个静态方法,该方法调用存储的过程,然后用返回的数据填充其属性 我的问题是,;从集合继承是错误的吗,因为它并没有真正扩展类?或者最好不要从任何对象继承,而是维护一个集合类型的私有变量?如果您的业务对象可以向世界提供常用的集合方法,那么从集合继承就可以了。正如我猜想的那样,事实上你给它添加了一些东西——你指定了T Udate: 根据作者的评论,所有收集方法的发布都会使对象可编辑,这是不可接受的。因此,他将使私有字段成为可枚举类,而不

我有一个业务对象集合(表示数据库中的数据),该集合继承自集合,并有一个静态方法,该方法调用存储的过程,然后用返回的数据填充其属性


我的问题是,;从集合继承是错误的吗,因为它并没有真正扩展类?或者最好不要从任何对象继承,而是维护一个集合类型的私有变量?

如果您的业务对象可以向世界提供常用的集合方法,那么从
集合继承就可以了。正如我猜想的那样,事实上你给它添加了一些东西——你指定了
T

Udate:
根据作者的评论,所有收集方法的发布都会使对象可编辑,这是不可接受的。因此,他将使私有字段成为可枚举类,而不是继承

实际上,最“纯粹”的方法是在继承对象时不添加任何内容。几乎没有人试着变得那么纯洁,但那被认为是更纯洁的。其思想是您可以重写某些方法来“填补空白”,以了解对象的行为,但您不会添加任何非私有成员


我不主张要那么纯洁。关键是,你所做的任何事情都不是“不纯洁的”。(注意:我根本没有使用“pure”和“inpure”这两个词,因为它们与函数式语言一起使用。只是在字典定义的一般意义上)。是的,这是错误的。您应该有一个对象来执行集合的返回。另外,除非有迫切的需要,否则不要将方法设置为静态。新的Blah().foo()没有问题。任何适当的JIT都将内联对象创建


此外,我认为在99%的情况下扩展集合是错误的:)通常,当人们扩展集合时,他们真正应该做的只是编写一个列表,只公开客户真正需要的内容,或者只是使用一个简单的列表。

如果不看到更多关于您尝试做什么的细节,就很难给出答案。然而,我通常不会从集合继承,因为它并没有提供足够的虚拟方法来重写。这可能会使将来改变类的行为变得有点棘手

继承的问题在于,如果您使用它,您将永远无法摆脱集合基类的行为,或者面临复杂的重构。例如,您可能希望添加筛选、搜索和排序操作,此时您需要从集合切换到列表。您甚至可能希望在需要BindingList而不是集合的情况下进行数据绑定

另一种计划是从ICollection继承,或者更好的是从IList继承,然后委托给私有集合成员。这为您提供了最大限度的控制,并允许您在不影响公共接口的情况下更改类的内部表示形式。这样做的问题是开发类需要更长的时间

因此,您所面临的是更快的开发和未来的灵活性之间的权衡,正如我在开始时所说的,从原始帖子中给出的信息判断该走哪条路有点困难


PS:要使IList实现为只读,只需从IsReadOnly返回true,然后从所有更改列表的方法中抛出NotSupportedException。

XOR的回答让我意识到,通过从集合继承,它可以在我真正希望对象为只读时使其可编辑,这表明继承是错误的,相反,我应该封装集合并且只让它可枚举。非常好的推导。我们必须考虑的不是一种方法的抽象正确性,而是这种方法的实际后果。