Contesto: .NET 4.0, C#C# utilizzando farmaci generici e l'interfaccia di implementazione
Sto creando una serie di interfacce e una serie di clases che li implementano per fornire un certo servizio. I client utilizzano le clases concrete ma chiamano metodi dichiarati utilizzando le interfacce come tipi di parametri.
Un esempio semplificato è questa:
namespace TestGenerics
{
// Interface, of fields
interface IField
{
}
// Interface: Forms (contains fields)
interface IForm<T> where T : IField
{
}
// CONCRETE CLASES
class Field : IField
{
}
class Form <T> : IForm<T> where T : IField
{
}
// TEST PROGRAM
class Program
{
// THIS IS THE SIGNATURE OF THE METHOD I WANT TO CALL
// parameters are causing the error.
public static void TestMethod(IForm<IField> form)
{
int i = 1;
i = i * 5;
}
static void Main(string[] args)
{
Form<Field> b = new Form<Field>();
Program.TestMethod(b);
}
}
}
Il codice ha senso per me, ma ho l'errore del compilatore:
Argument 1: cannot convert from '
TestGenerics.Form<TestGenerics.Field>
' to 'TestGenerics.IForm<TestGenerics.IField>
' TestGenerics
io non sono sicuro di quello che sto facendo male , Ho letto molte pagine su internet ma nessuno ha risolto il mio problema.
Esiste una soluzione che non modificare più di tanto l'architettura di quello che sto cercando di costruire:
Edit: ho progettato le interfacce in modo tale da dover essere indipendenti clases concreti che li implementano . Le clases concrete potrebbero essere caricate da una DLL, ma la maggior parte delle applicazioni funziona con le interfacce. In alcuni casi ho bisogno di usare clases concreti, specialmente quando si usano clases che devono essere serializzati.
Grazie in anticipo.
Alejandro
Questo sarebbe caduta sotto il regno di covarianza. In particolare, se aggiungi il modificatore generico '' out' '(http://msdn.microsoft.com/en-us/library/dd469487.aspx) all'interfaccia 'firma IForm dove T: IField' funzionerà .Ma questo aggiunge altre limitazioni/considerazioni quindi non posso commentare se è applicabile al tuo attuale design/utilizzo. –
Sono curioso di sapere cosa stai cercando di realizzare con questo design. – sidesinger
Grazie mille per entrambi i guardiani, erano davvero timidi. Ho aggiunto una modifica che spiega perché ho desingato la soluzione in questo modo, ma entrambi i ricercatori possono risolvere il mio problema. Saluti. – Sugar