一般的な抽象クラスとそのサブクラスに問題があり、解決方法がわかりません。次の抽象クラスがあります。
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
}
また、Country クラスを含む CommonPoco のサブクラスも多数あります。ここまでは順調ですね。さて、問題は、一般的なメソッドを実装したいと思います。このメソッドは、いくつかのパラメーターに基づいて、タスクに適切なローダーを使用します。多分このようなもの:
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 を使用しています。必要に応じて、抽象クラスであっても、必要なものは何でも変更します。ありがとう。抽象クラスの代わりにインターフェイスを使用すると、これが可能になるのでしょうか。