Sto usando il C++builder del Borland Dev.Studio 2006, ma penso che il problema sia indipendente dall'ambiente di sviluppo.
Premetto che, essendo io un programmatore "nato" col VB6, magari sto facendo una domanda "stupida", ma io non ci riesco....
Cosa ho (semplifico molto):
Una classe base, che deriva da una classe "standard" del C++builder
codice:
class cBase: public TObject {
private:
char cNome[0xFF];
String __fastcall GetNome() {return (String)cNome;};
void __fastcall SetNome(String sNome) {strncpy(cNome,sNome.c_str(),0xfE);cNome[0xff]=0;};
int iIndice;
public:
String __fastcall StringaDati(){return "";};
__property String Nome = {read=GetNome, write=SetNome};
__property int Indice = {read=iIndice, write=iIndice};
};
una decina di classi (cDerivata1, cDerivata2,...) derivate dalla cBase, che ridefiniscono il metodo "StringaDati", e una "Collection" (una lista) che, dato l'indice, restituisce un "TObject*".
Al momento, se voglio chiamare il metodo "StringaDati" per tutte le classi istanziate devo sapere che tipo di classe c'è al dato indice e castare il puntatore al tipo giusto:
supponiamo che le prime 10 siano cDerivata1, dalla 10 alla 20 siano cDerivata2 ecc...
codice:
for (j=0;j<100;j++) {
if (j<10) {
Dati = (cDerivata1*)Lista->Items[j]->StringaDati();
continue;
}
if (j<20) {
Dati = (cDerivata2*)Lista->Items[j]->StringaDati();
continue;
}
....
}
La cosa è evidentemente orrenda.
Quello che mi serve è un modo per chiamare il metodo "StringaDati" fregandomene del Tipo di classe a cui sto puntando.
In pratica, qualcosa tipo:
codice:
for (j=0;j<100;j++) {
Dati = (qualcosa*)Lista->Items[j]->StringaDati();
}
lasciando che sia qualcosa a sapere quale "versione" di StringaDati serve.
Non ho capito se 'sta cosa si fa con le "interfacce", e se sì come si fa....
....qualcuno mi da una mano?