In passato ho usato l'ereditarietà per consentire l'estensione dei moduli di Windows nella mia applicazione. Se tutti i miei moduli avessero controlli, grafica e funzionalità comuni, creerei un modulo di base che implementa i controlli e le funzionalità comuni e quindi consenti agli altri controlli di ereditare da quel modulo di base. Tuttavia, ho riscontrato alcuni problemi con quel design.
I controlli possono essere solo in un contenitore alla volta, quindi qualsiasi controllo statico che hai sarà complicato. Ad esempio: supponiamo di avere un modulo di 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ò trovarsi in un solo contenitore alla volta. Probabilmente sarebbe sull'ultimo modulo inizializzato. Sebbene ogni istanza possa modificare il controllo, verrà visualizzato solo in uno alla volta. Certo, ci sono soluzioni alternative, ma sono tutti brutti. (Questo sembra essere un progetto davvero brutto per me. Perché più contenitori non possono memorizzare puntatori sullo stesso oggetto? Comunque, è quello che è.)
Stato tra i moduli, ovvero gli stati dei pulsanti, il testo dell'etichetta, ecc., Devo utilizzare le variabili globali per e ripristinare gli stati su Caricamento.
Questo non è molto ben supportato dal designer di Visual Studio.
Esiste un design migliore, ma ancora facilmente gestibile da usare? O l'ereditarietà delle forme è ancora l'approccio migliore?
Aggiornamento Sono passato dall'osservare MVC a MVP al modello Observer al modello eventi. Ecco cosa sto pensando per il momento, per favore, critica:
La mia classe BaseForm conterrà solo i controlli e gli eventi collegati a tali controlli. Tutti gli eventi che necessitano di qualsiasi tipo di logica per gestirli passeranno immediatamente alla classe BaseFormPresenter. Questa classe gestirà i dati dall'interfaccia utente, eseguirà qualsiasi operazione logica e quindi aggiornerà BaseFormModel. Il Modello esporrà gli eventi, che si attiveranno al cambio di stato, alla classe Presenter, alla quale si iscriverà (o osserverà). Quando il Presenter riceve la notifica dell'evento, eseguirà qualsiasi logica e quindi il Presenter modificherà la vista di conseguenza.
Ci sarà solo una di ciascuna classe Model in memoria, ma potrebbero esserci potenzialmente molte istanze di BaseForm e quindi BaseFormPresenter. Ciò risolverebbe il mio problema di sincronizzazione di ogni istanza di BaseForm con lo stesso modello di dati.
Domande:
Quale livello dovrebbe memorizzare cose come, l'ultimo pulsante premuto, in modo da poterlo evidenziare per l'utente (come in un menu CSS) tra i moduli?
Per favore, critica questo disegno. Grazie per l'aiuto!