【问题标题】:Collection Inheritance集合继承
【发布时间】:2016-08-01 13:34:51
【问题描述】:

我正在尝试实现以下目标,但我不确定它是否可能。

我有以下“基础”实体

public abstract class BaseObject {}
public abstract class BaseCollection <T> : ObservableCollection<T> where T : BaseObject {}

我也有

public class Obj_1: BaseObject {}
public class Obj_1_collection : BaseCollection <Obj_1>
{
    public Obj_1_Method_1 () {}
}

和

public class Obj_2: Obj_1 {}

按照与Obj_1 相同的逻辑,我想要一个Obj_2_collection。我希望这个集合继承自 Obj_1_collection 以便访问它的方法,例如Obj_2_collection.Obj_1_Method_1()。正如我的想法一样,我正在尝试执行以下操作(在伪代码中):

public class Obj_2_collection : Obj_1_collection<Obj_2 extends Obj_1>

表示Obj_2_collection 可以访问Obj_1_collection,但是集合对象的类型为Obj_2

【问题讨论】:

  • 您是否尝试将您的Obj_1_collection 定义为public class Obj_1_collection&lt;T&gt; : BaseCollection &lt;T&gt; where T : Obj_1 {}
  • Obj_1 和 Obj_2 需要继承同一个基类 BaseObject。在您的代码中,您有 Obj_2 继承 Obj_1。
  • @jdweng 这意味着Obj_2也继承自BaseObject
  • @jdweng 这是因为我需要 Obj_2 继承 Obj_1,这是我的逻辑的一部分。例如 base = 车辆,Obj_1 = 汽车,Obj_2 = 豪华车

标签: c# inheritance collections


【解决方案1】:

您快到了,唯一的问题是您没有将您的 Obj_1_collection 定义为泛型。

为此,您只需使用用于 BaseCollection&lt;T&gt; 的语法并将类型 T 限制为 Obj_1

这会给:

public class Obj_1_collection<T> : BaseCollection <T> where T : Obj_1 {}

关于泛型和继承的使用,您可能想了解in 和out 修饰符关键字以启用covariance 和contravariance。

作为旁注,这里是C# naming conventions

【讨论】:

  • 经过一些快速测试后,您的建议似乎有效。在接受之前,我需要在“现实世界”的例子中对其进行测试,但我很肯定你会得到“复选标记”。现在为链接资源+1。还有一个免责声明,我熟悉命名约定,命名和代码仅用于示例目的。
  • @Athafoud 那就太好了 :) 最好在没有用时链接它们,而不是在需要它们时不链接它们:p
  • 我能看到的唯一问题是每次我使用Obj_1_collection时,我都需要将它实例化为new Obj_1_collection&lt;Obj_1&gt;()。这意味着大量的重构,这是我试图避免的。
  • @Athafoud 似乎无法让 C# 从构造函数中推断参数类型,请参阅此问题:stackoverflow.com/questions/3570167/… 了解更多信息。抱歉,如果不以一种或另一种方式进行重构,您似乎将无法做到。
  • 虽然这不是最好的方法,但我正在考虑在两个集合中复制所需的方法。至少现在应对和维护重复代码比重构“工作量少”。
猜你喜欢
  • 2012-01-11
  • 2012-01-18
  • 2012-03-14
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多