我对通用抽象类及其子类有一些问题,我不知道如何解决。我有以下抽象类:
public abstract class Loader<T> where T: CommonPoco {
public virtual List<T> LoadFromFile(StreamReader input, out List<T> result, bool trackProgress) {
return LoadFromFile(input, out result, trackProgress, CultureInfo.CurrentCulture);
}
public abstract List<T> LoadFromFile(StreamReader input, out List<T> result, bool trackProgress, IFormatProvider format);
public abstract T UploadToDb(List<T> data);
}
这是我的 CommonPoco:
public class CommonPoco {
private int line;
public int Line {
get { return line; }
set { line = value; }
}
private string error;
public string Error {
get { return error; }
set { error = value; }
}
}
现在我还有很多其他的 Loader 子类,比如这个:
public class CountryLoader: Loader<Country> {
public override List<Country> LoadFromFile(StreamReader input,
out List<Country> result, bool trackProgress, IFormatProvider format) {
//Method implementation
}
public override Country UploadToDb(List<Country> data) {
//Method implementation
}
而且我还有很多 CommonPoco 的子类,包括 Country 类。到现在为止还挺好。现在问题来了,我想实现一个通用的方法。此方法将根据某些参数为任务使用正确的加载器。也许是这样的:
void LoadModule<T>(Module module) where T: CommonPoco {
Loader<T> loader;
switch (module) {
case Module.Country:
loader = new CountryLoader();
break;
}
}
这不起作用,编译器抱怨说它不能从 CountryLoader 转换为 Loader。我必须创建一个方法来加载我的每个模块,它们是完全相同的代码,除了 Loader 类的初始化。我真的很讨厌重复的代码,我该如何实现呢?
忘了提,使用 .NET Framework 4.0。我愿意改变任何需要的东西,如果必须的话,甚至是我的抽象类。谢谢。我想知道使用接口而不是抽象类是否可以让我这样做。