in

dotNet Umbria

Il primo User Group in Umbria sul mondo .Net
Latest post 06-01-2008 2:04 AM by Paolo Possanzini. 3 replies.
Page 1 of 1 (4 items)
Sort Posts: Previous Next
  • 05-28-2008 9:12 AM

    • Tmasi
    • Top 50 Contributor
    • Joined on 02-18-2008

    user controls astratti in VS2005

    Salve a tutti,

    è la prima volta che posto in questo forum e vorrei chiedervi un consiglio riguardo la creazione di una astrazione su degli UserControl che stò sviluppando(C# in VS05) ...

    La mia idea è quella di creare una classe ASTRATTA  A che estende UserControl  e mette a disposizione alcuni metodi CONCRETI in cui codifico delle funzionalità comuni a tutte le sottoclassi concrete che la estenderanno.

    In particolare pensavo di rendere astratto il metodo initComponent creato dal designer di VS in modo da poter creare una veste grafica diversa per ogni usercontrol concreto. 

    Con questa implementazione  però il designer di  VS si incavola ritornando l'errore "unable to instantiate an abstract class",evidentemente cerca di creare un'istanza di A al momento del disegno dell'interfaccia!

    c'è un modo per gestire astrazioni di Usercontrol in VS pur mantenendo le funzionalità del designer?? 

    se non trovo un altro modo devo incapsulare le funzionalità comuni in un oggetto a parte ma se possibile vorrei evitarlo.

    ciao,

    Giovanni 

  • 05-28-2008 10:27 AM In reply to

    Re: user controls astratti in VS2005

    Ciao Giovanni,

    quello che puoi realizzare con una classe astratta è più una sorta di baseUC che poi dovrai far ereditare ai tuoi UC specializzati. Esistono in verità molte scelte diverse per realizzare quanto chiedi, sicuramente pero' non è possibile instanziare una classe astratta.

    Una possibilità tra le tante potrebbe essere quella di rendere lo UC non astratto e di astrarre solo il comportamento dell'init in base ad un parametro, magari un enum, mettendo le diverse configurazioni in una classe "factory" esterna. Alternativamente puoi mantenere la classe astratta e implementarla nei diversi UC specializzati...

    Si possono studiare n soluzioni al caso, in ogni modo purtroppo non è possibile instanziare una classe astratta.

    Andrea Cruciani

  • 05-28-2008 10:49 AM In reply to

    • Tmasi
    • Top 50 Contributor
    • Joined on 02-18-2008

    Re: user controls astratti in VS2005

     ciao Andrea,

    io non volevo istanziare la classe astratta, ci mancherebbe altro.. Big Smile  è il designer di VS che tentava di farlo!

    comunque ho risolto il problema, lasciando la classe base A non astratta e facendo l'inheritance a mano senza usare il comando "add new">"inherited user control" ma creando un nuovo UC che estende A e modificando a mano il codice creato dal designer.

    lo svantaggio di questa soluzione è che resta possibile istanziare un UC di tipo A e ciò non ha molto senso, in attesa di una soluzione migliore per impedirlo al momento ho limititato la visibilità del costruttore di A...

     ciao,

    Giovanni 

  • 06-01-2008 2:04 AM In reply to

    Re: user controls astratti in VS2005

    Mi intrometto. Secondo la mia esperienza con Windows Forms, non è una grandissima idea quella di rendere astratto InitializeComponents. Hai altri modi per intervenire. Il designer si incavola perchè ovviamente da reflection deve invocare il metodo InitComponents e per farlo ha bisogno di una instanza della classe.

    Secondo me puoi provare ad implementare l'interfaccia ISupportInitialize. In questo modo tutte le volte che il tuo UC viene utilizzato ricevi delle notifiche relative all'ingresso del metodo InitializeComponents del parent ed alla sua uscita e puoi fare il lavoro che ti serve.

    Se quello che vuoi cambiare è solo la veste grafica allora la strada migliore è fare degli "Extenders" da richiamare al momento del Paint o del PaintBackground.

    Se preferisci una soluzione meno invasiva ed utilizzabile anche senza modificare la catena di ereditarietà del controllo di destinazione, allora puoi utilizzare un Extender Provider. Sicuramente non è una strada semplice ma è efficace.

    Come vedi le soluzioni per modificare un UC sono molte, ce ne sono altre che non ti ho elencato. La scelta ovviamente spetta a te ma personalmente eviterei la customizzazione del metodo InitializeComponents diettamente, ma cercherei una strada che renda le mie customizzazioni grafiche più compatibili con il designer.

    Spero di esserti stato di aiuto

    Ciao

Page 1 of 1 (4 items)
dotNet Umbria 2007-2008
Powered by Community Server (Commercial Edition), by Telligent Systems