il mio problema è il seguente. Ho realizzato un progetto di codice per un progetto di casa che apparentemente non funziona. Forse puoi aiutarmi a capire da dove viene il "codice odore".Dichiarazione di una variabile di tipo generico astratto
Ok cominciamo: ho definito alcune classi per avvolgere diversi tipi di tipi di archivio:
public abstract class Archive { }
public class ZipArchive : Archive { }
public class TarArchive : Archive { }
da maneggiare con quegli archivi, ho definito le classi Manager. Un uno astratto che definisce il comportamento necessario,
public abstract class ArchiveManager<T> where T : Archive
{
public abstract void OpenArchive(T archive);
}
E quelli concreti, che in realtà attuare il behaiour specifica:
public class ZipArchiveManager : ArchiveManager<ZipArchive>
{
public override void OpenArchive(ZipArchive archive) { /* .. */ }
}
public class TarArchiveManager : ArchiveManager<TarArchive>
{
public override void OpenArchive(TarArchive archive) { /* .. */ }
}
Quello che succede ora è che durante la fase di compilazione, non so che tipo degli archivi che elaborerà, così ho provato la seguente:
class Program
{
static void Main(string[] args)
{
ArchiveManager<Archive> archiveManager = null;
if (/*some condition*/) {
archiveManager = new ZipArchiveManager();
}
else {
archiveManager = new TarArchiveManager();
}
}
}
che ha finito il seguente errore:
012.Cannot implicitly convert type 'ZipArchiveManager' to 'ArchiveManager'
Per quanto ho capito, l'argomento generico non può essere convertito implicitamente. C'è un modo per aggirare questo? Questo codice/design "annusa"?
Grazie mille in anticipo.
Creare un classe base non generica o utilizzare un'interfaccia covariante. – CodesInChaos
Inoltre, la firma di 'OpenArchive' mi sembra sbagliata. Non dovrebbe ricevere un flusso e restituire 'T'? – CodesInChaos