Ho una situazione interessante in cui mi piacerebbe utilizzare una classe base che utilizza un parametro di tipo per implementare un'interfaccia e anche mantenere le cose asciutte con le classi ereditarie.Implementazione generica dell'interfaccia con il tipo specificato
public interface ICalculator
{
void Process(ICalculationModel calculationModel);
}
public abstract class CalculatorBase<T> :ICalculator where T : ICalculationModel
{
// Compiler moans that Process(ICalculationModel calculationModel) isn't implemented
public abstract void Process(T calculationModel);
}
public class PipeworkInspections : CalculatorBase<GasSafetyModel>
{
public override void Process(GasSafetyModel documentModel){
//snip
}
}
C'è qualcosa che mi manca con la clausola generica 'where' o qualcosa del genere? Nella mia testa questo dovrebbe funzionare. O il compilatore ha bisogno ESATTAMENTE della stessa implementazione della definizione dell'interfaccia?
Non riesco facilmente a spostare il parametro di tipo nell'ICalculator in quanto vi sono molti punti in cui viene utilizzato senza alcun requisito per il generico.
Questo ha chiarito le cose. Grazie per le informazioni. Ora ovviamente una soluzione è fare in modo che l'interfaccia prenda il parametro type. Tuttavia gli ICalculator sono usati in un numero di posti e sono indicati come ICalculator
Ora ho errori del compilatore se ometto il parametro type nelle interfacce che si riferiscono a ICalculator ... C'è un modo per architettare questo che dovrebbe funzionare !?
Credo che debba essere identico a come appare in "ICalculator". Tuttavia, dato che faccio principalmente roba Java e non C#, non posso dirlo con certezza. – Powerlord
Questo non può funzionare dal momento che si potrebbe quindi eseguire 'ICalculator c = new PipeworkInspections(); c.Process (new OtherModel()) 'che non è sicuro. Il meglio che potreste fare sarebbe impiantare 'ICalculator.Process' e quindi eseguire il cast all'interno dell'implementazione generica. – Lee