私の問題は次のとおりです。私は明らかに動作していない家庭プロジェクトのコードデザインを作成しました。たぶんあなたは私が "コードのにおい"がどこから来るのか理解するのを助けることができます。抽象的なジェネリック型変数の宣言
もOKですが、始めましょう: 私はアーカイブの種類の周りの異なる種類のラップするためにいくつかのクラスを定義している:これらのアーカイブを処理するために
public abstract class Archive { }
public class ZipArchive : Archive { }
public class TarArchive : Archive { }
を、私はマネージャークラスを定義しました。今、何が起こる
public class ZipArchiveManager : ArchiveManager<ZipArchive>
{
public override void OpenArchive(ZipArchive archive) { /* .. */ }
}
public class TarArchiveManager : ArchiveManager<TarArchive>
{
public override void OpenArchive(TarArchive archive) { /* .. */ }
}
コンパイル時に、私はどのようなものを知らないということです。実際には、特定のbehaiourを実装すること 必要な動作を定義する抽象1、
public abstract class ArchiveManager<T> where T : Archive
{
public abstract void OpenArchive(T archive);
}
とコンクリートのもの、私が処理するのアーカイブので、私は次のことを試してみました:
次のエラーで終わったclass Program
{
static void Main(string[] args)
{
ArchiveManager<Archive> archiveManager = null;
if (/*some condition*/) {
archiveManager = new ZipArchiveManager();
}
else {
archiveManager = new TarArchiveManager();
}
}
}
:
私が理解する限り、総称引数を暗黙的に変換することはできません。これを回避する方法はありますか?このコード/デザインは "匂い"ですか?
ありがとうございます。
作成し、C#の.NET 4.0の「ダイナミック」キーワードを使用して、別の方法...私にとっては魔法のように
作品を見つけました一般的ではないベースクラスを使用するか、共変インタフェースを使用します。 – CodesInChaos
また、OpenArchiveの署名が間違っています。ストリームを受け取って、 'T'を返すべきではありませんか? – CodesInChaos