2010-07-17 13 views
27

Es gibt einige schwarze Magie-Code in C#, wo Sie die Standard-Implementierung einer Schnittstelle definieren können.Wie definiert man die Standardimplementierung einer Schnittstelle in C#?

So können Sie

var instance = new ISomeInterface(); 

Alle Zeiger schreiben?

UPDATE 1: Beachten Sie, dass ich nicht gefragt habe, ob das eine gute Idee ist. Wie war es nur möglich?

UPDATE 2: an alle, die die akzeptierte Antwort sehen.

  • "Dies sollte nur als eine Kuriosität behandelt werden." von Marc Gravel "Newing up" Interfaces
  • "Es ist eine schlechte Idee, ein Werkzeug für COM-Interop zu verwenden, etwas komplett und völlig anders zu machen. Das macht Ihren Code unmöglich für den nächsten Kerl zu verstehen, der es zu halten hat". Eric Lippert "Newing up" Interfaces
  • "Obwohl es funktionieren könnte, wenn es jemals in Produktionscode von einem rationalen Codierer gefunden wurde, würde es stattdessen refactored, eine Basisklasse oder Abhängigkeitsinjektion zu verwenden." von Stephen Cleary in einem Kommentar unten.
+0

einige Artikel zu diesem Thema: http: // Stackoverflow. com/questions/1093536 und http://blogs.msdn.com/b/ericlippert/archive/2007/04/20/chained-user-defined-explicit-conversions-in-c-part-three.aspx –

+0

Ist da Noch immer kein vernünftiger Weg, dies zu tun? –

+0

@WilliamJockusch immer noch der einzige, den ich kenne – Simon

Antwort

28

Hier kommt die schwarze Magie:

class Program 
{ 
    static void Main() 
    { 
     IFoo foo = new IFoo("black magic"); 
     foo.Bar(); 
    } 
} 

[ComImport] 
[Guid("C8AEBD72-8CAF-43B0-8507-FAB55C937E8A")] 
[CoClass(typeof(FooImpl))] 
public interface IFoo 
{ 
    void Bar(); 
} 

public class FooImpl : IFoo 
{ 
    private readonly string _text; 
    public FooImpl(string text) 
    { 
     _text = text; 
    } 

    public void Bar() 
    { 
     Console.WriteLine(_text); 
    } 
} 

Beachten Sie, dass nicht nur eine Schnittstelle instanziiert kann aber auch Argumente an den Konstruktor übergeben :-)

+4

Nun, ich habe gesagt, es war schwarze Magie. Danke, Darin. – Simon

+0

Und mit dem Stichwort "CoClass" sind die Google-Götter wieder bei mir. http://ayende.com/Blog/archive/2009/08/15/instantiating-interfaces.aspx http://marcgravell.blogspot.com/2009/08/who-says-you-cant-instantiate-interface .html – Simon

+0

@Simon, das sind zwei Blogs, die ich dir empfehlen würde deinen RSS-Reader zu tunen :-) –

3

Nur wenn ISomeInterface eine Klasse ist.

Update (zur Klarstellung):

Jon Skeet hat a talk wo er Standardimplementierungen für Schnittstellen erwähnt. Sie sind jedoch nicht Teil der C# -Sprache. Die Rede ist, was Jon Skeet wie in einer zukünftigen Version von C# sehen würde.

Zur Zeit werden die einzigen Standardimplementierungen über (möglicherweise abstract) Basisklassen durchgeführt.

+0

Jemand ging durch und dv'ed alle rationalen Antworten ... –

+0

Ich downvoted alle falschen Antworten. weil sie falsch waren. keine Rationalität darüber. Siehe Darins Antwort – Simon

+2

Ich sah die "richtige" Antwort. Obwohl es funktionieren könnte, wenn es jemals in Produktionscode von einem rationalen Codierer gefunden würde, würde es stattdessen refactored sein, eine Basisklassen- oder Abhängigkeitsinjektion zu verwenden. –

2

Vielleicht beziehen Sie sich auf Dependency Injection? Wo, wenn DI Rahmen (wie Ninject oder Unity) verwenden, können Sie Standardinstanz für jede Schnittstelle definieren und sie dann wie folgt aus:

(vorausgesetzt, Sie haben IWeapon Schnittstelle und Sword implementiert es)

IKernel kernel = new StandardKernel(); 
kernel.Bind<IWeapon>().To<Sword>(); 
var weapon = kernel.Get<IWeapon>(); 

Aber Ninject (und die meisten anderen IoC-Frameworks) können einige schlauere Dinge tun, wie zum Beispiel: Wir haben die Klasse Warrior, die IWeapon als Parameter in ihrem Konstruktor verwendet. Wir können eine Instanz von Warrior von Ninject erhalten:

var warrior = kernel.Get<Warrior>(); 

Ninject die iWeapon Umsetzung gehen wir zu den Warrior Konstruktor angegeben und die neue Instanz zurück.

Ansonsten kenne ich keine In-Sprache-Funktion, die diese Art von Verhalten ermöglicht.

+0

guten Vorschlag, aber nicht das, was ich gesucht habe. Siehe Darins Antwort – Simon

+1

Ja, ich habe den Teil vermisst, wo du "schwarze Magie" in deiner Frage erwähnt hast :-) Danke, dass du das fragst - ich habe etwas Neues gelernt! – arikfr

Verwandte Themen