Newsgroup: it.comp.lang.c++
Titolo: classi interfaccia e classi concrete

Saluti a tutti.
Se uso un'interfaccia, implementata ad esempio come classe astratta
pura, riesco a disaccoppiare le eventuali diverse implementazioni di una
classe dall'interfaccia (appunto) unica con la quale queste vengono
viste dal resto dell'applicazione. Tuttavia nel punto di dichiarazione
degli oggetti, anche se uso dei puntatori, devo necessariamente
specificare che classe concreta voglio utilizzare, anche se poi usero'
l'oggetto solo tramite l'interfaccia di cui sopra. E' possibile spostare
questa dipendenza all'esterno dell'applicazione, in modo che non debba
ricompilare il programma se voglio cambiare la classe concreta da
utilizzare ? Se si, le tecniche utilizzabili sono legate all'ambiente
Windows o sono portabili anche su UNIX/Linux ?
Potreste anche indicarmi dove trovare le FAQ di questo ng ?
Grazie mille,
Gianpaolo



Chiaramente non puoi eliminare la dipendenza, perche` all'atto della
costruzione devi sapere che oggetto costruire. Pero` puoi isolarla
in una classe ad hoc e ricompilare solo quel pezzo di programma.
La soluzione dovrebbe essere nel pattern Factory. Ne trovi una
buona descrizione nell'ottimo "Design Patterns" di Gamma, Helm
ed altri... E` edito da Addison Wesley e vale molto piu` di quel che 
costa. 
La soluzione e` del tutto generale ed assolutamente portabile, nel 
limite della portabilita` del codice con cui la si implementa.
Le (attualmente uniche) q di questo NG si trovano su
www.programmazione.it
Paolo
-----------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
-----------------------------------------------

 costa.
A questo punto mi lancio nell'investimento!
Grazie e ciao,
Gianpaolo

Prova a leggere gli articoli presenti ai seguenti indirizzi
http://rampages.onramp.net/~huston/dp/factoryMethod.html
http://rampages.onramp.net/~huston/dp/factory.html
http://rampages.onramp.net/~huston/dp/builder.html
http://rampages.onramp.net/~huston/dp/prototype.html
e fatti un'idea dei pattern che puoi utilizzare per risolvere il tuo
problema.
Quindi, come gia' ti e' stato detto, compra il libro "Design Patterns" che
e' la sorgente dei pattern di cui sopra.
MM

La soluzione che ti ha suggerito Paolo e' l'unica possibile da un punto
di vista diciamo di "linguaggio" e quindi l'unica portabile. Esistono
invece delle tecniche a livello di sistema che risolvono esattamente il
tuo problema, ma che facilmente richiedono meccanismi specifici della
piattaforma su cui lavori.
L'idea generale e' quella di servirsi di librerie dinamiche: sotto
Windows puoi accedere alle funzioni di una DLL dinamicamente e quindi
limitarti ad aggiungere nuove funzioni e scegliere quale chiamare in
base ad esempio ad un file di configurazione (che ti devi inventare tu).
Potresti avere diverse funzioni che creano gli oggetti concreti che ti
servono e poi chiamare quella appropriata.
Per quanto ne so io sotto UNIX questo non e' possibile; in questo caso
dovresti creare piu' librerie dinamiche e scegliere di volta in volta
quale linkare, cosa che puoi in genere fare utilizzando le variabili di
environment che specificano il path dove trovare le librerie.
Ciao,
Nicola
P.S. Il libro che ti ha suggerito Paolo compralo in ogni caso, che e'
splendido. Se poi hai altri soldi da spendere c'e' "Advanced C++ -
Programming Styles and Idioms" di James O. Coplien che descrive tra le
altre cose come sostituire un metodo in una libreria dinamica "al volo"
(su UNIX). Questo libro e' piu' difficile dell'altro e forse un po'
datato, ma descrive come fare col C++ delle cose che a prima vista
sembrerebbero impossibili.

 environment che specificano il path dove trovare le librerie.
Si, il metodo delle DLL + file di configurazione in ambiente Windows e'
davvero potente, ed e' un grosso peccato che non sia disponibile sotto
UNIX. Dal momento che non conosco bene l'uso delle dll sotto UNIX ti
chiedo se quando dici "linkare" intendi dire in modo statico durante la
compilazione, oppure se almeno e' possibile scegliere a runtime quale
DLL utilizzare in base ad un file di configurazione.
Chiedo scusa per le imprecisioni.
ciao e grazie,
Gianpaolo

 Nicola
*Fabio*
-- 
A man may be so much of everything that he is nothing of anything.
		-- Samuel Johnson

 Chiedo scusa per le imprecisioni.
Generalmente la scelta della libreria dinamica dipende da una variabile
di ambiente, che specifica le directory in cui cercare le librerie
dinamiche. Il nome della variabile puo' variare a seconda della variante
di UNIX. Su Sun e' LD_LIBRARY_PATH, sugli altri non lo so.
Ciao,
Nicola

 
Appunto, come dicevo io. Mi sfugge qualcosa...
Ciao,
Nicola

 Nicola
-- 
Real Programmers don't eat quiche.  They eat Twinkies and Szechwan food.