【发布时间】:2011-03-24 04:57:05
【问题描述】:
我已经阅读了许多其他相关的问题,但仍然无法完全弄清楚如何做我们需要做的事情。使用泛型不是必须的,但似乎是我们可能获得所需的唯一方法。我们在 .net 3.5 中,所以我们不能使用我认为相关的新的 .net 4.0 东西。假设我们有一个具有一些属性和方法的基类 Parent。我们还有一个 ParentCollection,它目前实现了 IEnumerable。我们还为这个类添加了额外的属性和方法。
我们现在需要从 Parent 继承来创建 ChildA。但是,我们还需要从 ParentCollection 继承来创建 ChildACollection。然后,我们将 ChildA 的对等类作为 ChildB 和 ChildBCollection。
ChildACollection 和 ChildBCollection 及其项是唯一实际实例化的东西。 Parent 的东西是抽象的。
ParentCollection 和 Parent 上有一些方法可以返回满足条件的项目子集,也可能被操纵。
问题是由于这些方法正在处理集合中的项目,我们希望返回的集合是后代的类型。例如通过 ChildACollection 的实例调用在 ParentCollection 中定义的方法 SomeMethod(),因此子集返回的类型是 List 而不是 List。
有没有办法实现这种功能?
我们正在尝试做的示例伪代码
public class Parent
{
public string PropA { get; set; }
public int PropB { get; set; }
public void DoSomething() { }
}
public class ParentCollection : IEnumerable<Parent>
{
protected List<Parent> _list = new List<Parent>();
public IEnumerator<Parent> GetEnumerator()
{
return _list.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public List<Parent> SomeSelectMethod()
{
List<Parent> list = new List<Parent>();
// DO LOGIC HERE TO DETERMINE WHAT ITEMS WILL BE IN LIST
return list;
}
}
public class ChildA : Parent
{
public double PropC { get; set; }
public void DoSomethingElse() { }
}
public class ChildACollection : ParentCollection
{
public void SomeChildMethod() { }
}
public class MyTestClass
{
public void Main()
{
ChildACollection myCollection = new ChildACollection();
//HERE IS THE PROBLEM
List<ChildA> childList = myCollection.SomeSelectMethod();
}
}
基本上我想利用继承,但不让 ChildACollection 的用户必须不断地将列表中返回的对象引用转换为 ChildA 对象。我的意思是内部列表将具有实际的 ChildA 对象而不是 Parent 对象,但由于该方法位于 ParentCollection 类中,它只知道它是 Parent 或后代类的对象。希望这是有道理的。
帮助?
跟进问题: 我需要将此层次结构更深一层(孙子)并在 Parent 上添加一个 Add 方法,该方法将创建并将适当的对象类型添加到列表中,即如果在 ChildCollection 引用上调用 Add ,它应该创建并添加一种 Child 并返回对列表中新创建的对象的引用。可能吗?
【问题讨论】:
-
受保护列表
_list = new List ();你知道你已经继承了 IEnumerable ,这实际上是一个列表,所以你不需要 _list 元素成为类的一部分。