Sono alle prese con una situazione che mi viene ripetuta di volta in volta, ma non sono sicuro se il modo in cui sto facendo le cose sia sbagliato o se potrei fare le cose in un modo diverso.Utilizzo di un Windows Form come classe astratta: quale pattern utilizzare?
Un esempio:
Ho una forma di Windows che ha una DataGridView con alcuni metodi privati per eseguire la convalida del datagrid e interpretare clic destro del mouse sul datagridview ecc Questa forma finestre è essenzialmente una classe di "astratto" e non viene mai istanziato direttamente.
Quindi eredito da questa classe di base e la personalizzo in vari modi (modello di modello) ad es. definire le colonne del datagridview e particolari metodi di formattazione che sono specifici per quelle colonne ecc.
Quando consumo queste classi i metodi pubblici di classe base formano la mia interfaccia e posso istanziare il tipo particolare di datagridview che voglio e manipolarlo attraverso l'interfaccia comune. Bello.
Il problema:
Il problema principale è che non si può effettivamente dichiarare una classe Windows Form come astratta senza provocare la progettazione di Visual Studio per gettare un traballante in quanto non può istanziare queste classi astratte.
alcune soluzioni:
Al momento mi sto "di esecuzione" questi metodi nella classe di base che voglio essere sostituite con:
throw new NotSupportedException();
così almeno se mi dimentico di ignorare una delle questi metodi che formano la mia interfaccia. Questo mi sembra piuttosto maleodorante e non mi piace molto.
Un'altra soluzione con cui ho giocato era eliminare completamente l'ereditarietà e definire un'interfaccia (ad esempio IMyDataGrid) e implementarla in ogni classe datagridview (una sorta di modello di strategia). Il problema qui però è che perdi i vantaggi del riutilizzo del codice che l'ereditarietà ti dà il significato che devi creare molti moduli diversi, rilasciare una vista dati su di essi - copiare e incollare in modo efficace lo stesso codice in ognuno di essi. Cattivo.
C'è un modo migliore per cercare di raggiungere questo obiettivo?
Perché non ereditare direttamente da GridView e creare un controllo per l'utilizzo su un Windows Form? – Macros