In passato, ho utilizzato l'ereditarietà per consentire l'estensione dei moduli di Windows nella mia applicazione. Se tutte le mie forme avessero controlli, elementi grafici e funzionalità comuni, creerei un modulo di base che implementa i controlli e le funzionalità comuni e quindi consentirò ad altri controlli di ereditare da tale modulo di base. Tuttavia, ho riscontrato alcuni problemi con questo design.
-
I controlli possono essere solo in un contenitore alla volta, quindi qualsiasi controllo statico che hai sarà difficile. Ad esempio: Supponiamo di avere un modulo base chiamato BaseForm che conteneva un TreeView che rendi protetto e statico in modo che tutte le altre istanze (derivate) di questa classe possano modificare e visualizzare lo stesso TreeView. Ciò non funzionerebbe per più classi che ereditano da BaseForm, perché TreeView può essere solo in un contenitore alla volta. Sarebbe probabilmente sull'ultimo modulo inizializzato. Sebbene ogni istanza possa modificare il controllo, verrà visualizzata solo in una volta. Certo, ci sono dei work-around, ma sono tutti brutti. (Questo mi sembra un progetto davvero pessimo, perché non è possibile che più contenitori memorizzino puntatori allo stesso oggetto? Comunque, è quello che è.)
-
Stato tra i moduli, ovvero gli stati dei pulsanti, il testo dell'etichetta, ecc. Devo usare le variabili globali per e resettare gli stati su Load.
-
Questo non è supportato molto bene dal designer di Visual Studio.
C'è un design migliore, ma ancora facilmente gestibile da usare? O l'ereditarietà della forma è ancora l'approccio migliore?
Aggiorna Sono passato dall'osservazione di MVC a MVP a modello di osservatore per il pattern di evento. Ecco cosa sto pensando per il momento, per favore critica:
La mia classe BaseForm conterrà solo i controlli e gli eventi connessi a quei controlli. Tutti gli eventi che richiedono una sorta di logica per gestirli passeranno immediatamente alla classe BaseFormPresenter. Questa classe gestirà i dati dall'interfaccia utente, eseguirà tutte le operazioni logiche e quindi aggiornerà BaseFormModel. Il Modello esporrà eventi, che spareranno su cambiamenti di stato, alla classe Presenter, alla quale si iscriverà (o osserverà). Quando il relatore riceve la notifica dell'evento, eseguirà qualsiasi logica, quindi il relatore modificherà la vista di conseguenza.
Ci sarà solo una di ciascuna classe del modello in memoria, ma potrebbero esserci potenzialmente molte istanze di BaseForm e, quindi, BaseFormPresenter. Questo risolverebbe il mio problema di sincronizzare ogni istanza di BaseForm con lo stesso modello di dati.
Domande:
Quale layer dovrebbe memorizzare cose come, l'ultimo pulsante premuto, in modo che possa tenerlo evidenziato per l'utente (come in un menu CSS) tra le forme?
Si prega di criticare questo design. Grazie per il tuo aiuto!