Klassen-Design
-
Ich möchte bald ein kleines API veröffentlichen und hätte bezüglich dazu eine Frage zum Design der Klassen:
Ich habe 2 Klassen. Eine Klasse (nennen wir sie MemoryHandler) ist die Hauptklasse. Nun will ich den Benutzer die Option geben ein zusätzliches Modul "dazu zu schalten". Dieses Modul wäre der SignatureHandler. Der SignatureHandler braucht einen vollkommen initialisierten MemoryHandler.
Ich hatte 2 Designansätze:
1. Den MemoryHandler über den Konstruktor übergeben
MemoryHandler MH = new MemoryHandler(Option1, Option2...); SignatureHandler SH = new SignatureHandler(MH,...);
2. Den SignatureHandler als Sub-Klasse
MemoryHandler MH = new MemoryHandler(Option1, Option2...); MH.SignatureHandler SH = new MH.SignatureHandler(MH?...);
Mir gefällt der Ansatz bei 2 besser aber wie kann ich dort zum Beispiel umgehen, dass ich bei new MH.SignatureHandler(MH) den MemoryHandler übergeben muss...am liebsten hätte ich nach dem Motto "Erstelle MemoryHandler...bei bedarf Module zum MemoryHandler zusätlich aktivieren". Ist diese Möglichkeit in OOP realisierbar?
Danke
-
Wenn du einen vollstanedig Initialisierten MemoryHandler brauchst, dann biete doch einfach diverse Ctor an welche deinen MemoryHandler vollstaendig initialisieren dann hast du auch keine Probleme diesen deinem SignaturHandler zu uebergeben.
-
Das initialisieren des MemoryHandler is ja nicht das Problem und auch nicht die Übergabe.
Das Problem ist z.B das später mehrere MemoryHandler + SignatureHandler gibt.
e.g.
MH1 = new MemoryHandler(Programm1); SH1 = new SignatureHandler(MH1); MH2 = new MemoryHandler(Programm2); SH2 = new SignatureHandler(MH2);
Das wird schnell sehr unübersichtlich. Deswegen denke ich an Sub-Klassen (auch wenn ich mal gehört habe dass das keine elegante Lösung ist) sodass man den SignatureHandler einfach so aufrufen kann:
MH1 = new MemoryHandler(Programm1); MH1.SignatureHandler.MachWas();
Gibt es eine Möglichkeit (sofern es keine elegantere als Sub-Klassen gibt) den SignatureHandler "hinzu zu schalten"? Und wenn ja, wie soll man das am schönsten implementieren?
-
Und wo kommt die Instanz der Klasse SignaturHandler her in Deinem Ansatz mit der nested class?
Hier mal ein Vorschlag:
class Program { static void Main(string[] args) { MemoryHandler mh1 = new MemoryHandler(); mh1.SignaturHandler.foo(); Console.ReadKey(true); } } class MemoryHandler { private SignaturHandler signaturHandler; public SignaturHandler SignaturHandler { get { if (signaturHandler == null) signaturHandler = new SignaturHandler(this); return signaturHandler; } } } class SignaturHandler { MemoryHandler memoryHandler; public SignaturHandler(MemoryHandler memoryHandler) { this.memoryHandler = memoryHandler; } public void foo() { } }
-
Der Ansatz gefällt mir.
Danke