2016-07-01 16 views
1

sagen, ich habe diese beiden SchnittstellenNichtgenerisches Kontra

public interface A 
{ 

} 

public interface B 
{ 
    A a {get;} 
} 

Und diese beiden Betontypen

public class ConcreteA : A 
{ 
} 

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

Diese nicht kompiliert, da Schnittstelle B eine Schnittstelle A anstelle eines ConcreteA erwartet.

Zur Zeit erzeuge ich Code mit Schnittstellen automatisch, und ich lief in diesen Senario. Anstatt alle meine Modelle zu implementieren und die explizite Schnittstellendefinition zu ändern, in der die Schnittstellenversion meiner konkreten Klasse zurückgegeben würde, würde ich dies gerne mit einer Version der Kovarianz machen, aber ich bin mir nicht sicher, ob es einen Weg gibt dies oder wenn dies eine Beschränkung von C# ist.

  1. Gibt es eine Schnittstelle Art und Weise Version von Kontra, die mich, dies zu tun erlauben würde?

    1.1 Wenn nicht, gibt es einen expliziten Grund, warum dies nicht implementiert wird, oder gibt es ein Szenario, in dem ein Problem auftreten würde, wenn dies implementiert wäre?

+0

Sie benötigen Generics, weil 'B b = new ConcreteB();' es Ihnen erlauben würde, 'a' auf alles zu setzen, das' A' implementiert, nicht nur 'ConcreteA'. – juharr

+0

@juharr dein Recht danke, ich sah das aus. Angenommen, Sie hätten nur die Schnittstelle bekommen, wäre aber immer noch in der Lage, aber das wäre eine spezielle Nischenanwendung. –

Antwort

2

Sie werden es generische machen müssen für diese

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;} 
} 

zu arbeiten, das ist, weil

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

nicht in der Lage sein, Sie zu zwingen, nur um es einrichten zu etwas, das ist ConcreteA sonst.

+0

Ihr Recht werde ich als Antwort akzeptieren, wenn das Zeitlimit es mir erlaubt –

Verwandte Themen