Implementation von Schnittstelle trennen
-
Hallo,
gibt es in C#, oder generell in .NET, eine Moeglichkeit,
die Schnittstelle von der Implementation zu trennen?Ich denke dabei zum Beispiel an die Moeglichkeit in C++ mit
den Header- und Cpp-Dateien. Da konnte man schreiben// Interface.h class Interface { public: void test(); }; // Interface.cpp void Interface::test() { ... }
Nach so einer Trennung suche ich in C#. Ich fuerchte nur,
dass es nicht moeglich ist, da ich auf meiner Suche
nach der Loesung nicht fuendig geworden bin. Das ist hier
quasi meine letzte Hoffnung.Prinzipiell moechte ich aber etwas wie das Pimpl-Idiom in
C# vermeiden, ich will die Implementierungs-Bloecke vollkommen
vermeiden und nur die Methoden-Signatur - die Schnittstelle -
zugaenglich machen, die Implementierung aber in einer anderen
Datei verstecken. Es geht mir lediglich um eine saubere Trennung. :xmas2:
-
Interface keyword? Partial classes?
-
häh schrieb:
Interface keyword?
interface/abstract bringt nichts, wenn der Benutzer sich eine konkrete
Klasse im Code ansieht, die er anschliessend ueber new erzeugt.Partial classes?
Nur wenn partial es mir erlaubt, den selben Methodennamen in beiden Klassen
mit dem seben Namen zu verwenden. Soweit ich weiss, ist dies nicht der Fall.
-
Zitat:
Partial classes?Nur wenn partial es mir erlaubt, den selben Methodennamen in beiden Klassen
mit dem seben Namen zu verwenden. Soweit ich weiss, ist dies nicht der FallPartielle Klassen sind nicht da um Impl. und Interface zu trennen.
So wie in C++ ist das in C# nicht möglich.
Jedoch gibts interfaces (entsprechen Klassen mit nur pure virtual Methoden). Mit dem Bridge- Pattern lässt sich die Impl. von Interface trennen.Gruss Simon
-
endline schrieb:
gibt es in C#, oder generell in .NET, eine Moeglichkeit,
die Schnittstelle von der Implementation zu trennen?C# 3.0 bietet dieses Feature (Visual Studio 2008). Mit partial methods hat man nun wieder die Möglichkeit, Methoden-Definition und -Implementation einigermaßen sauber zu trennen. Die Implementation von partiellen Methoden ist optional, d.h. der Compiler entfernt jeden Verweis auf die Methode wenn diese nicht implementiert wurde.
Es gibt allerdings eine Reihe von Einschränkungen:
- partielle Methoden sind immer privat
- sie können nicht als virtuell deklariert werden
- sie können nur eine einzige Implementation haben und diese muss sich in der gleichen Klasse befinden
- partielle Methoden müssen void zurückgeben
- sie können keine out-Parameter haben
- man kann nicht zu einer partiellen Methode delegierenmms://wm.microsoft.com/ms/uk/msdn/nuggets/PartialMethodsVS2008.wmv
-
maro158 schrieb:
C# 3.0 bietet dieses Feature (Visual Studio 2008). Mit partial methods hat man nun wieder die Möglichkeit, Methoden-Definition und -Implementation einigermaßen sauber zu trennen.
Gut, dass Du darauf hinweist. Allerdings wird das wohl eher nicht das sein, was der OP wissen wollte (nur, um Missverständniss zu vermeiden).
-
Ich versteh dein Problem net ganz.
endline schrieb:
häh schrieb:
Interface keyword?
interface/abstract bringt nichts, wenn der Benutzer sich eine konkrete
Klasse im Code ansieht, die er anschliessend ueber new erzeugt.Wenn du die Klasse so erstellst das der User die einfach erzeugen kann ist es doch deine Schuld, da gibts genug Möglichkeiten das zu verhindern(static/internal z.b. je nach Anforderung).
In C++ erreichst du die Tennung ja auch nur wenn du die Header mit Object Code verwendest gegen den du linkst. In C# wäre das Pendant ja auch nen Assembly mit deiner Implementation und die Verwendung von Interfaces. Jetzt musst du halt nur noch ne geeignete Art finden die Implementationen aus der Assembly heraus anzubieten - dazu eignet sich z.B. das Factory Pattern. Schon hast du dein Problem gelöst im Prinzip.
-
Konrad Rudolph schrieb:
Gut, dass Du darauf hinweist. Allerdings wird das wohl eher nicht das sein, was der OP wissen wollte (nur, um Missverständniss zu vermeiden).
Könntest Du das bitte erläutern?
-
maro158 schrieb:
Konrad Rudolph schrieb:
Gut, dass Du darauf hinweist. Allerdings wird das wohl eher nicht das sein, was der OP wissen wollte (nur, um Missverständniss zu vermeiden).
Könntest Du das bitte erläutern?
Klar. Es ging dem OP doch, denke ich, darum, Deklaration und Definition öffentlichen Schnittstelle voneinander zu trennen, um, wie in C++, eine Datei quasi mit der Dokumentation der Klasse zu erhalten.
Mal davon abgesehen, dass das mit Partial Methods nicht geht, da diese nicht öffentlich sein können (und die weiteren von Dir genannten Einschränkungen tragen), halte ich das auch nicht für sinnvoll. In .NET hat man dafür ja „bessere“ Werkzeuge, wie den Objektexplorer.
-
Konrad Rudolph schrieb:
Klar. Es ging dem OP doch, denke ich, darum, Deklaration und Definition öffentlichen Schnittstelle voneinander zu trennen, um, wie in C++, eine Datei quasi mit der Dokumentation der Klasse zu erhalten.
Du hast Recht. Ich hatte das "public" übersehen.