Ho un semplice programma che disegna figure geometriche basate su dati del mouse forniti dall'utente. Ho una classe che gestisce il tracciamento del mouse (ottiene la lista con la cronologia dei movimenti del mouse) e una classe astratta chiamata Shape. Da questa classe deraglio alcune forme extra, come Circle, Rectangle, ecc. - e ognuna di esse sovrascrive la funzione Abstract Draw().Superamento del principio Open-Closed
Funziona tutto bene, ma il problema si presenta quando voglio che l'utente sia in grado di cambiare manualmente la forma desiderata . Ottengo i dati del mouse e so quale forma dovrei disegnare. Il problema è come fare in modo che il codice "sappia" quale oggetto dovrebbe creare e passare i parametri appropriati per il costruttore al parametro . A questo punto è anche impossibile aggiungere nuovi derivati di forma, che è assolutamente sbagliato.
mi obiously non voglio uscire con un codice simile:
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.
Il codice di cui sopra chiaramente vilates Open-Closed Principle. Il problema è che non ho alcuna idea su come superarlo. Il problema principale è che le diverse forme hanno costruttori con parametri diversi, il che rende molto più problematico.
Sono abbastanza sicuro che questo è un problema comune, ma non so come superarlo. Hai un'idea?
Questo non è il "principio aperto-chiuso". Questo è solo polimorfismo –
Bene, voglio che il codice della classe Shape sia chiuso per l'edizione e aperto per le estensioni, quindi penso che corrisponda al problema OCP. –
Per quanto tu desideri che sia vero, non lo è! –