Bonjour à tous,
Cela fait quelques temps que je me triture le crâne sur la conception d'une bibliothèque d'interfaces.
Le problème est que certaines de mes interfaces renvoient des collections d'interfaces.
Prenons un cas concret.
Vous êtes d'accord avec moi sur le fait qu'une banque contient des comptes bancaires.
Jusque la tout est ok.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 interface IBanque { IList<ICompteBancaireBase> ComptesBancaires{ get; set; } }
Depuis un compte bancaire, on peut connaitre l'entreprise à qui il appartient.
Tout comme depuis une entreprise, on peut connaitre ses comptes bancaires.
Nous avons donc une relation bilatérale IEntreprise et ICompteBancaire.
Maintenant, l'entreprise peut être la notre, tout comme cela peut-être un client, un fournisseur. Pour plus de simplicité, nommons les autres entreprises : EntrepriseTierce
Vous serez aussi d'accord avec moi sur le fait que nous ne pouvons pas réaliser les mêmes opérations sur les comptes bancaires de notre entreprise et ceux d'une entrepriseTierce.
J'ai donc voulu rendre mon interface IEntreprise générique, pour qu'elle ne renvoie que des IComptesBancairesTiers lorsque c'est une instance de IEntrepriseTierce et qu'elle ne renvoie que des IComptesBancaires pour l'instance de IMonEntreprise.
C'est la qu'intervient mon problème, je suis confronté au concept de covariance et contravariance.
Lorsque je manipule une IEntreprise, je voudrais pouvoir obtenir la collection des ComptesBancaires de cette entreprise et peu importe si c'est la mienne ou une tierce.
Cependant, lorsque je manipule MonEntreprise lorsque je récupère ses comptes bancaires, il ne faut pas que cette collection puisse contenir une compte bancaire tier.
A l'inverse, les comptes bancaires d'une IEntrepriseTierce ne doit contenir que des comptesBancairesTiers.
Mais puisque j'ai rendu mon interface IEntreprise générique, je doit savoir si c'est une collection de ICompteBancaire ou ICompteBancaireTiers lorsque je récupère les comptes bancaires d'une IEntreprise.
Donc comment définissez-vous vos interfaces dans ce genre de relations?
Je vous remercie de votre aide.
Partager