Newsgroup: it.comp.lang.visual-basic
Titolo: Problema con le classi

Ho le seguenti classi:
Classe1
Classe2
ClasseComune
I membri di ClasseComune possono essere chiamati sia da Classe1 che da
Classe2.
E fin qui tutto OK.
Classe1 e Classe2, sono indipendenti l'una dall'altra, in quanto gestiscono
fonti di dati diverse, ma implementano le stesse funzioni, alla stessa
maniera:
Classe1.Trova(X)
Classe1.Mostra(X, Y, Z)
Classe2.Trova(X)
Classe2.Mostra(X, Y, Z)
Ci sarebbe un modo che mi permetta di sapere, da ClasseComune, se è stata
chiamata da Classe1, o Classe2?
In modo tale, sarebbe possibile referenziare la classe chiamante (Classe1 o
Classe2) con una gerica ClasseX, ed eseguire da ClasseComune
ClasseX.Trova(X), ecc... ?
Vi sarei davvero grato se riusciste a risolvere questo problema.


La parola chiave Implements forse potrebbe aiutarti.
Scusa, ma mi sono perso...
Sopra dici che Classe1 e Classe2 chiamano i membri di ClasseComune (e quindi
probab. istanziano una o piu' ClasseComune) , sotto descrivi la situazione
inversa:
ClasseComune istanzia Classe1 e Classe2  e chiedi se e' possibile uniformare
l'interfaccia.
Boh:  Per la seconda ipotesi se vuoi ti scrivo un breve esempio dell'uso di
implements, tieni conto che l'argomento e' vasto, consiglio lettura di testi
(mi pare che sul Balena ci sia qualcosa).


Ciao Neo,
crea una Interfaccia, ovvero una classe astratta pura.
Procedi, definendo in modo definitivo quali sono le 
Property e i metodi che accomunano i tuoi tipi,
ne definisci i parametri e i tipi, ovvero le firme.
Nelle classi derivate utilizza la parola chiave Implements.
Quindi
crea una classe, esempio IClassNo, e definisci le firme dei
metodi Mostra e Trova:
Public Function Mostra (X As TipoA, Y As TipoB, Z As Long) As Boolean
	'No code here
End Function
Public Function Trova(X As TipoA) As TipoC
	'No code here
End Function
Public Property Set Parent(objParent As ClasseComune) 
	'No code here
End Property
Public Property Get Parent() as ClasseComune
	'No code here
End Property
In Classe1 e Classe2, dopo Option explicit, metti:
         Implements IClassNo
e nota che nei combo di selezione oggetti/metodi
troverai IClassNo e Class a sinistra e, quando selezionata
IClassNo a destra trovi i metodi Mostra e Trova, e la
Property Parent.
Se li selezioni l'IDE ti crea automaticamente:
Private Function IClassNo_Mostra (X As TipoA, Y As TipoB, Z As Long) As
Boolean
 
End Function
Private Function IClassNo_Trova(X As TipoA) As TipoC
 
End Function
Private Property Set IClassNo_Parent(objParent As ClasseComune) 
 
End Property
Private Property Get IClassNo_Parent() As ClasseComune
 
End Property
Sposta il codice dei metodi Mostra e Trova originari nei nuovi
IClassNo_* e rimuovi le firme vecchie nelle classi derivate 
(per firma intendo la dichiarazione della Function).
Fissa con Set Parent il riferimento a ClasseComune:
potrai quindi dalle classi figlie richiamare metodi 
del padre.
Adesso affronta il reciproco, ovvero chiamare i metodi delle 
classi figlie dalla ClasseComune.
In ClasseComune dichiara un tipo locale IClassNo
Dim ObjClassNo   As IClassNo
Quando occorre:
Set ObjClassNo = CreateObject("Class1")
objclassNo.Trova(X)
...
Set ObjClassNo = CreateObject("Class2")
objclassNo.Mostra(X, Y, Z)
etc.
Se prosegui lungo questa strada ti accorgerai essere utile anche una 
collection, in ClasseComune, di classi derivate di IClassNo;
potrai sfruttare costrutti For Each, For..Next, Loop etc.
HTH
Ciao
	Adriano