我如何设置以下类,以便我可以使用一个公共父类/接口的方法,并允许我迭代任何子节点而不指定泛型类型?
public abstract class BaseClass
{ ??? }
public class ChildClass<T> : BaseClass
{
public List<T> SomeList;
???
}
ChildClass<int> childA = new ChildClass<int> ();
ChildClass<string> childB = new ChildClass<string> ();
public void IterateOverChild (BaseClass someChildClass)
{
foreach (var element in someChildClass.SomeList)
{
Console.WriteLine (element);
}
}
答案 0 :(得分:6)
让抽象类暴露一些访问子类之间通用数据的方法,在这种情况下,是一个数据序列,其中每个对象可以是任何类型:
public abstract class BaseClass
{
public abstract IEnumerable Data { get; }
}
public class ChildClass<T> : BaseClass
{
public List<T> SomeList { get; set; }
public override IEnumerable Data { get { return SomeList; } }
}
答案 1 :(得分:2)
使用
public abstract class BaseClass<T>
{
public List<T> SomeList { get; set; }
}
public class ChildClass<T> : BaseClass<T>
{
}
public void IterateOverChild<T>(BaseClass<T> someChildClass)
{
foreach (var element in someChildClass.SomeList)
{
Console.WriteLine(element);
}
}
答案 2 :(得分:0)
除非BaseClass
知道<T>
,否则它不能包含T
类型的任何属性或方法。但是,您可以提供一个基本实现,至少公开您的属性的非泛型形式。您丢失了类型信息但保留了可枚举性。
public abstract class BaseClass
{
public IList SomeList { get; set; }
}
public class ChildClass<T> : BaseClass
{
public new List<T> SomeList
{
get { return (List<T>) base.SomeList; }
set { base.SomeList = value; }
}
}