返回包含泛型List的类

时间:2014-03-20 21:50:35

标签: c# generics polymorphism

我正在尝试在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);
}

重点是方法PopulateMyDerivedClassderive1derive2的确完全相同,只是它返回不同类型的列表。

我想我需要泛型。但那是在基类级别,也是PopulateMyDerivedClass然后应该返回通用?我想也许我不是在处理多态性问题,但是你可以猜测我是仿制药的新手,所以很挣扎。

2 个答案:

答案 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