Erstellen von Objekten aus einer Schnittstelle in C #

8

Es ist möglich, nur eine Schnittstelle zu erstellen, um daraus ein Objekt zu erstellen?

Etwas wie:

%Vor%

(Ich weiß, dass dieser Code nicht richtig ist - VS-Aufenthalte können keine Instanz von IWidget erstellen)

Ich bin in einem Kontext, in dem mein Projekt Verweise auf die Schnittstellen hat, und ich möchte konkrete Objekte erstellen und sie von einer Methode zurückgeben - aber ich kann nicht herausfinden, wie man die Objekte rein von den Schnittstellen erzeugt / p>     

wows 02.02.2010, 19:17
quelle

5 Antworten

8

Sie können kein Objekt von einer Schnittstelle erstellen. Sie können ein Objekt aus einer Klasse erstellen, die diese Schnittstelle verwendet.

Zum Beispiel:

%Vor%

funktioniert nicht.

%Vor%

wird.

Schnittstellen können nicht erstellt werden, nur Objekte, die die Schnittstelle verwenden, können erstellt werden.

    
taylonr 02.02.2010, 19:20
quelle
9

Dieser Code ist aufgrund der Compiler-Assistenten für COM-Objekte korrekt. Normalerweise ist es aber nicht.

Das Problem ist, wie soll der Compiler welche Implementierung zu erstellen wissen? Es könnte irgendeine Nummer geben. Sie sollten in Betracht ziehen, eine Factory für die Schnittstelle zu haben oder möglicherweise die Abhängigkeitsinjektion zu verwenden (zB mit Spring.NET oder Burg Windsor ).

    
Jon Skeet 02.02.2010 19:20
quelle
4

Dies ist nicht möglich rein von den Schnittstellen (und sollte nicht sein, was ist, wenn es mehr als eine Implementierung davon gibt?). Es klingt wie das, was Sie tun möchten, ist eine Schnittstelle freizugeben, aber nicht die Implementierung. Ist das richtig?

Sie möchten im Wesentlichen ein Factory-Muster . Bei diesem Muster wird eine Methode erstellt, die die Schnittstelle zurückgibt, aber intern einen konkreten Typ instanziiert. Es lässt Sie den konkreten Typ von jedem verstecken, der die Schnittstelle benutzt.

Wenn Sie einen Schritt weiter gehen, können Sie Inversion of Control (IoC) verwenden. Ich weiß nicht, was die beste Option ist, dies in .Net zu tun, aber eine Option ist Spring.Net . Sie verwenden eine Konfigurationsdatei, um alle verschiedenen Setups für Ihre konkreten Objekte zu definieren, und lassen dann diese Instanzen automatisch in Ihre Klassen "injizieren", die die Schnittstelle verwenden.

    
Chris Pitman 02.02.2010 19:25
quelle
0

Nein wäre die kurze Antwort. Aber ich denke, Sie könnten einen IoC-Container verwenden, um eine Implementierung zu injizieren.

    
chrissie1 02.02.2010 19:21
quelle
0

Sie suchen möglicherweise nach einem Dependency-Injection-Framework .

    
oefe 02.02.2010 19:24
quelle

Tags und Links