我正在尝试在c#(5.0)中构造一个我可以用作基类的类,它包含一个List,但List可以是两种不同的类型。我想做以下事情:
public class BaseC
{
string header { get; set; }
List<object> recs { get; set; }
}
public class derive1: BaseC
{
List<myclassA> recs;
}
public class derive2: BaseC
{
List<myclassB> recs;
}
并且重要的是我想要做的是从另一个类中的方法返回派生类:
public BaseC PopulateMyDerivedClass()
{
BaseC b = new BaseC();
b.header = "stuff";
b.recs = FileHelperEngine<myclassB> fhe.ReadStringAsList(x);
}
重点是方法PopulateMyDerivedClass
对derive1
和derive2
的确完全相同,只是它返回不同类型的列表。
我想我需要泛型。但那是在基类级别,也是PopulateMyDerivedClass
然后应该返回通用?我想也许我不是在处理多态性问题,但是你可以猜测我是仿制药的新手,所以很挣扎。
答案 0 :(得分:5)
我认为你想要的是使BaseC
成为泛型类,并在定义派生类时指定泛型:
public class BaseC<T>
{
//...
virtual List<T> Recs { get; set; }
}
public class Derived1 : Base<MyClassA>
{
override List<MyClassA> Recs { get; set; }
}
Alexei Levenkov的好点:
通常注意:在这种情况下,DerivedX类不会与原始样本不同。如果需要将DerivedX视为具有公共父/接口,则可能需要添加更多层类(作为BaseC的非泛型父级)或使用接口。
答案 1 :(得分:1)
我觉得你的代码设计可以使用一些重新思考。首先,通常当我们谈论“多态性”时,我们通常会讨论多态行为(方法),而不是成员。我想你可能想要考虑两个实现一个接口的类,它可以完成你希望每个类做的所有事情(将数据解析为它自己的列表类型并根据需要对它进行操作)。
然而,如果没有深入了解代码的细节,我认为这样的事情可能就是你想要实现的目标:
public class BaseC<T>
{
string header { get; set; }
public List<T> recs {get;set;}
}
和
public BaseC<T> PopulateClass<T>()
{
var b = new BaseC<T>();
b.recs = new List<T>();
T first = (T)Convert.ChangeType("1", typeof(T));
b.recs.Add(first);
return b;
}
检查我们的理智:
BaseC<String> d1 = PopulateClass<String>();
System.Diagnostics.Debug.Print(d1.recs.First().ToString());
System.Diagnostics.Debug.Print(d1.recs.First().GetType().ToString());
BaseC<int> d2 = PopulateClass<int>();
System.Diagnostics.Debug.Print(d2.recs.First().ToString());
System.Diagnostics.Debug.Print(d2.recs.First().GetType().ToString());
打印
1
System.String
1
System.Int32