2016-07-01 2 views
1

Dire que j'ai ces deux interfacesnon générique Contravariance

public interface A 
{ 

} 

public interface B 
{ 
    A a {get;} 
} 

Et ces deux types de béton

public class ConcreteA : A 
{ 
} 

public class ConcreteB : B 
{ 
    public ConcreteA a {get;} 
} 

Cela ne compile pas parce que l'interface B attend une interface A au lieu d'un ConcreteA.

Actuellement, je génère automatiquement du code avec des interfaces, et je suis tombé sur ce senario. Au lieu de modifier tous mes modèles à implémenter et Définition d'interface explicite dans laquelle retournerait la version d'interface de ma classe concrète, je voudrais le faire en utilisant une version de covariance, mais je ne suis pas sûr s'il y a un moyen de le faire ceci ou si c'est une limitation de C#.

  1. Existe-t-il une version interface de contravariance qui me permettrait de faire cela?

    1.1 S'il n'y a pas une raison explicite pour laquelle ceci n'est pas implémenté, ou y a-t-il un senario dans lequel serait problématique si cela était implémenté?

+0

Vous avez besoin de génériques, car 'B b = new ConcreteB();' vous permet de définir 'a' sur tout ce qui implémente' A', pas seulement 'ConcreteA'. – juharr

+0

@juharr, merci, j'ai regardé ça. Supposons que vous ayez seulement eu l'interface qui pourrait encore être fait mais que ce serait une utilisation de niche spécifique –

Répondre

2

Vous devrez faire générique pour que cela fonctionne

public interface B<T> where T : A 
{ 
    T a {get; set;} 
} 

public class ConcreteA : A 
{ 
} 

public class ConcreteB : B<ConcreateA> 
{ 
    public ConcreteA a {get; set;} 
} 

C'est parce que

B b = new ConcreteB(); 
b.a = AnythingThatImplementsA; 

ne serait pas en mesure de vous obliger à mettre seulement à quelque chose qui est ConcreteA sinon.

+0

Votre droit Je vais accepter cela comme une réponse lorsque le délai me permet de –