Ich habe ein einfaches Programm, das geometrische Figuren basierend auf Mausdaten vom Benutzer erstellt. Ich habe eine Klasse, die die Maus-Tracking behandelt (es erhält die Liste mit der Mausbewegung Geschichte) und eine abstrakte Klasse namens Shape. Aus dieser Klasse lasse ich einige zusätzliche Formen wie Kreis, Rechteck usw. erkennen - und jeder von ihnen überschreibt die abstrakte Funktion Draw().Vorbei kommen Open-Closed Prinzip
Alles funktioniert gut, aber das Problem kommt, wenn ich möchte, dass der Benutzer gewünschte Shape manuell wechseln kann. Ich bekomme die Mausdaten und ich weiß, welche Form ich zeichnen soll. Das Problem besteht darin, den Code so zu gestalten, dass er "weiß", welches Objekt erstellt werden soll, und geeignete Parameter an den Konstruktor übergeben. Es ist auch unmöglich, an dieser Stelle neue Shape-Ableitungen hinzuzufügen, was offensichtlich falsch ist.
ich obiously wollen nicht wie mit dem Code kommen:
List<Shape> Shapes = new List<Shape>();
// somwhere later
if(CurrentShape == "polyline"){
Shapes.Add(new Polyline(Points));
}
else if (CurrentShape == "rectangle"){
Shapes.Add(new Rectangle(BeginPoint, EndPoint));
}
// and so on.
Der obige Code eindeutig vilates das Open-Geschlossen-Prinzip. Das Problem ist, dass ich keine gute Idee habe, wie ich darüber hinwegkommen könnte. Das Hauptproblem ist, dass verschiedene Shapes Konstruktoren mit verschiedenen Parametern haben, was es viel mühsamer macht.
Ich bin mir ziemlich sicher, dass dies ein häufiges Problem ist, aber ich weiß nicht, wie ich darüber hinwegkommen soll. Hast du eine Idee?
Das ist nicht das "Offen-Geschlossen-Prinzip". Das ist nur Polymorphismus –
Nun, ich möchte die Shape-Klasse Code für die Edition geschlossen und für Erweiterungen geöffnet, so denke ich, dass es das OCP-Problem entspricht. –
So sehr du möchtest, dass es wahr ist, ist es nicht! –