ジェネリックな抽象クラスに問題があり、それはサブクラスなので、どうやって解決するのか分かりません。一般的な抽象クラスとジェネリックメソッド
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; }
}
}
は今、私もこの1のようにローダーの他の多くのサブクラスを持っている:
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ある
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);
}
:私は、次の抽象クラスを持っていますCountryクラスを含むCommonPocoの多くのサブクラス。ここまでは順調ですね。今問題に、私は、一般的な?、メソッドを実装したいと思います。このメソッドは、いくつかのパラメーターに基づいて、タスクに適切なローダーを使用します。たぶん、このような何か:
void LoadModule<T>(Module module) where T: CommonPoco {
Loader<T> loader;
switch (module) {
case Module.Country:
loader = new CountryLoader();
break;
}
}
これは動作しないと、コンパイラは、それがCountryLoaderからローダーに変換することはできませんと言って文句を言います。私はそれぞれのモジュールをロードするメソッドを作成しなければならず、Loaderクラスの初期化を除いて全く同じコードです。私は本当に重複したコードを嫌い、どのように私はこれを達成することができますか?
.NET Framework 4.0を使用しています。 私は必要なら何でも、私の抽象クラスでさえも変えたいと思っています。ありがとう。 抽象クラスの代わりにインターフェイスを使用すると、これを行うことができるのだろうかと思います。
キャッスルウィンザーなどのIoCコンテナを使用することも、リフレクションだけを使用することもできます。しかし、 'List'パラメータを 'List '戻り値を持つメソッドに持つ理由は何ですか?それは非常に奇妙なようです。 –
phoog
'Loader'(これは 'CountryLoader'です)は' Loader 'ではありません。 したがって、 'Country'は' CommonPoco'から継承されるかもしれませんが(上記のOPには関係はありませんが)、汎用クラスは継承ではありません。 –
Tejs
また、これは通常、人々が非タイプの特定のデータ(この場合は 'module')を渡し、強く型付けされた結果を期待するときに起こります。結果のタイプを判別できない場合は、そのデータへのアクセスをどのように計画するか再考する必要があります。 – Tejs