Newsgroup: it.comp.lang.delphi
Titolo: Ereditarietà Multipla...

Salve a tutti,
la struttura di classi con la quale mi trovo a dover lavorare è la seguente:
Entita_3d --- Linea_3d --- LineaPF
	  |
	  |-- Arco_3d  --- ArcoPF
Cioè LineaPF eredita da Linea_3d il quale eredita da Entita_3d.
LineaPF e ArcoPF hanno metodi comuni (non presenti in Linea_3d e Arco_3d) quindi
dovrebbe esserci una classe di nome EntitaPF dalla quale dovrebbero ereditare
sia Linea_3d che Arco_3d.
Questo naturalmente non si può fare ! :-(
Quindi dichiaro un'interfaccia IEntitaPF ed implemento i metodi sia in LineaPF
che in ArcoPF.
A questo punto io speravo di poter fare:
procedure F(ent:Entita_3d);
begin
  IEntitaPF(ent).MetodoPF;
  ...
end;
Dove 'ent' che viene passato alla funzione è stato precedentemente istanziato
come LineaPF o ArcoPF.
Ma il compilatore non ne è molto convinto e genera: Tipi Incompatibili
'IentitaPF' e 'Entita_3d'
Come posso fare ?
Grazie in anticipo, Stefano.

Come posso fare ?
forse ti sto dicendo una cavolata, ma potresti abbandonare l' interfaccia
utilizzando una classe base con alcuni metodi astratti. Le classi TEntita_3D
e TEntita_PF derivano da questa classe.
Poi organizzala come meglio credi !!
Quindi la struttura potrebbe essere:
TClasseBase
         |
         |-- TEntita_3D ----
         |                             |--  TArco_3D
         |                             |
         |                             |--  TLinea_3D
         |
         |
         |-- TEntita_PF ----
                                      |-- TArco_PF
                                      |
                                      |-- TLinea_PF
ora nella classe base definisci solo i metodi comuni mentre gli altri gli
dichiari astratti.
La sottoclasse che li vuole utilizzare, dovrà ridefinirli !!!
Poi in TEntita_3D e TEntita_PF, definisci (ovviamente) i metodi comuni a
TArco_3D, TLinea_3D e TArco_PF, TLinea_PF.
Forse in queste due righe ti ho detto cose assurde. Se fosse così non ti
sorprendere perchè mi capitano raramente questi problemini e quindi........
non ho molta confidenza !!
Ti saluto.....se hai da obiettare qualcosa o vuoi discutere, scrivi ancora
!!
Ciaooooo !!!!
Antonio Tarolla
BSSoftware Tips Mailing - List Support

 sapere, perchè potrebbe essere un motivo in più per aggiornarsi !! eheh
Credo di non aver capito molto della domanda ma so che Delphi supporta
l'ereditarietà multipla _fra interfacce_ il che significa (se ben ricordo)
che dovrebbe essere possibile scrivere una classe che implementi 2 (o +)
interfacce...
Ciao :-)
--
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)
AntiSpam: rimuovere il trattino basso dall'indirizzo per rispondere
AntiSpam: remove the underscore from the e-mail address to reply

 interfacce...
Infatti. Però non può ereditare il codice.
Mi spiego brevemente:
se hai una classe TFarfalla la puoi ereditare da una classe ( TInsetto) e da
tutte le intefaccie che vuoi, per esempio IOggettoVolante e
IAnimaleColorato. Dopo sarai tu a collegare i metodi e le proprietà di
queste interfacce con quelli di TFarfalla.
Quello che non puoi fare è di ereditare TFarfalla da TOggettoVolante e da
TAnimaleColorato mescolando metodi e campi come si può fare in C++.
Ciao Uberto

interfacce...
ah si....su questo sono d' accordo.
Io per "novità" nell' ereditarietà multipla, intendevo la definizione di una
classe che deriva da due ( o + ) classi base contemporaneamente invece di
far ricorso all' interfaccia.
Comunque a Stefano ho consigliato una classe base con metodi astratti per
sorvolare l' interfaccia e pure
l' ereditarietà multipla.
Vabbè, ci sentiamo !!
Ciaoooo !!!!!


 TAnimaleColorato mescolando metodi e campi come si può fare in C++.
Secondo te, in questo caso, ricorrere al contenimento è una soluzione valida
(stile COM) ?


valida (stile COM) ?
Dipende da cosa vuoi fare.
certo TFarfalla puņ derivare da TOggettoVolante e contenere un campo 
privato TAnimaleColorato. Se serve una cosa del genere e' sicuramente una 
strada valida.
Per esperienza pero' so che di solito si vuole arrivare a metodi protetti, 
a quel punto si ricorre ad una fakeClass e fine del discorso pulizia 
codice. ;-))
Cmq il vantaggio delle interfacce e' che se creo un oggetto TFarfalla posso 
usarlo sia come IOggettoVolante che come IAnimaleColorato, quindi nella 
fase di utilizzo dell'oggetto e non in quella di stesura codice.
Ciao Uberto
ps. per chi non lo sapesse il sistema delle FakeClass permette di accedere 
a campi e metodi protetti di classi non parenti.
Praticamente si dichiara nella stessa unit una nuova classe p.e. 
TFakeWinControl( TWinControl ) e nel codice basta fare un typecast di un 
TWinControl a TFakeWinControl per accedere ai suoi campi protetti.