Ereditarietà di interfacce in C #

Sto cercando di superare un problema abbastanza grande (per me) che ho trovato durante la scrittura della mia domanda. Guarda questo, per favore (proverò ad accorciare il codice per semplicità):

Ho un’interfaccia di root chiamata IRepository . Successivamente, IBookRepository : IRepository Next, class concreta che lo implementa: BookRepository : IBookRepository

Nella class RepositoryManager ho dichiarato private IRepository currentRepo;

IRepoItem è un’interfaccia implementata dalla class Book.

Ora, quando provo a fare qualcosa di simile:

 currentRepo = new BookRepository(); 

VisualStudio dà un messaggio di errore:

Imansible convertire implicitamente il tipo “BookRepository” in “IRepository”. Esiste una conversione esplicita (ti manca un cast?)

Ho provato a eseguire il cast esplicito, ma l’eccezione di runtime viene lanciata …

So (quasi per certo) che si tratta di qualcosa chiamata covarianza e questo è (probabilmente) risolto in .Net 4.0. Sfortunatamente sto scrivendo usando la versione 3.5 della struttura e non posso cambiarla. Per favore, dammi alcuni consigli su cosa fare – come superare questo problema? Mi piacerebbe ottenere correnteRepo da RepoFactory che produce pochi tipi di repository dipende dalle esigenze degli utenti. Non so se i collegamenti sono consentiti qui, ma scrivo una specie di blog su http://olgatherer.wordpress.com/ dove descrivo la creazione di applicazioni. Il mio inglese non è buono, ma spero che sia abbastanza per capirmi. Grazie in anticipo per la risposta.

Cordiali saluti, skrzeczowas

In .NET 3.5 non è assolutamente ansible trattare un IRepository come IRepository .

Dovremmo sapere di più su cosa stai usando il repository per RepositoryManager per sapere come risolverlo … ma potresti creare un’interfaccia IRepository non generica che IRepository estende? Fa in modo che includa tutti i membri che non si riferiscono a T. Quindi puoi dichiarare currentRepo come solo un IRepository .

Prova a usare il livello intermedio (IRep):

  interface IRepository { } interface IRep : IRepository where T : IRepoItem { } interface IBookRepository : IRep { } class BookRepository : IBookRepository { } 

allora puoi fare quello che vuoi:

  BookRepository br = new BookRepository(); IRepository currentRepo = br; 

In .NET 3.5 non esiste alcuna relazione tra IRepository e IRepository in .NET 4, è ansible ottenere qualcosa di simile con il supporto covarianza e controvarianza (ma dipende dalla dichiarazione dell’interfaccia IRepository)

Si consiglia di utilizzare un’interfaccia IRepository non generica e di eseguire autonomamente il cast. Lo so, non è meraviglioso, ma la funzionalità che descrivi richiede il supporto alla covarianza / contravarianza.