Newsgroup: it.comp.lang.visual-basic
Titolo: [NET] Ereditare da una classe a scelta...

Salve, vorrei creare una classe che si occupi dell'interfacciamento ai db... 
ora in .net ogni provider di database ha le sue classi chiamate con nomi 
diversi (es. oledbConnection per provider oleDb, sqlConnection per SQL 
Server ecc...)
Io vorrei creare una classe che erediti da una di queste a scelta... tipo:
public class Connection()
    select case TIPO_PROVIDER
        case OLEDB
            inherits oleDbConnection
        case SQL
            inherits sqlConnection
        case MYSQL
            inherits mysqlConnection
    end select
end class
come posso fare una cosa del genere? in pratica voglio una classe es. 
Connection che assuma il tipo a seconda del db utilizzato (se uso access 
Connection sarà di tipo oledbConnection, se uso sql server sarà di tipo 
sqlConnection ecc..)
si può fare? come?
GRAZIE 

Non puoi farlo perchè la dichiarazione inherits deve seguire
immediatamente la dichiarazione della classe.
Al massimo, se te lo consente - però non non ho mai provato -
puoi fare un overload della classe.
Si può fare l'overload dei metodi e delle funzioni ... questo si
ma non ho mai appicciato coverload su di una classe
Altrimenti dovresti farti una tua classe che erediti dalla classe
base connection e dentro lavorare con le select case di turno
per andare ad utilizzare il metodo corretto della rispettiva
classe.
Ciao
Andrea 

 classe.
cioè? non ho capito.. potresti fare un piccolo esempio?
GRAZIE 

 end class
[SNIP]
Non puoi, la classe base deve essere nota in fase di compilazione, non puo' 
cambiare a run time.
Dipende esattamente da quello che vuoi ottenere, ma potrebbe non essere 
necessario derivare da una classe, bensi' solo implementare l'interfaccia 
corretta; tutti gli oggetti xxxConnection implementano l'interfaccia 
IDbConnection, se fai la stessa cosa con la tua, puoi crearne un istanza e 
assegnare a run time, ora si, il riferimento corretto.
Es.
public class Connection Implements IDbConnection
[...]
end class
Shared Sub Main()
    Dim conn As Connection
    select case TIPO_PROVIDER
        case OLEDB
            Set conn = New oleDbConnection
        case SQL
            Set conn = New sqlConnection
        case MYSQL
            Set conn = New mysqlConnection
    end select
    [...]
End Sub
se poi, alla fine dei conti, non devi nemmeno estendere in alcun modo le 
classi xxxConnection esistenti, ma solo avere un oggetto connessione 
"neutro", anche la definizione di classe vista sopra e' inutile, ed e' 
sufficiente dichiarare la tua variabile 'conn' direttamente di tipo 
IDbConnection... tutti gli altri metodi di 
ADO.NET
 che necessitano di una 
connessione, accettano un riferimento di questo tipo.
Ciao
-- 
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown 

Se guardi bene, oledbconnection, sqlconnection e compagne
ereditano dalla classe base connection che espone dei metodi
che poi le suddette classi rimpiazzano con la loro versione
in overload.
Ok, se invece di ereditare dalla classe figlia, erediti dalla
classe madre, avrai gli stessi identici metodi che hanno a
disposizione le altre classi.
Indi per cui avrai
public classe MiaConnection
    inherits connectionbase
    public property dbype(Byval NewValue as dbTypeEnum)
        get
            return _dbType
        end get
        set
            _dbType = NewValue
        end set
    end property
    public sub overload shadows execute
        if _dbType = "ORACLE" then
            ...
        elseif _dbType = "SQLSERVER" then
            ...
        else
            ...
        end if
    end sub
    .....
end class
Non ho controllato che i nomi siano evvettivamente quelli
non ho .net sotto mano ... ne tantomeno ho verificato che
il codice sia scritto in maniera corretta, ma il concetto è quello
Ciao
Andrea 

 cioč? non ho capito.. potresti fare un piccolo esempio?
Devi farti una tua classe che al suo interno usa le interfacce tipo
IDbConnection, IDbDataAdapter... poi fai un select per la loro creazione:
Select Case TipoDB
Case TipoDb.Access
    IDbConnection = new OleDbConnection(...)
Ma attenzione: IDbConnection essendo generico non ha i metodi specifici per
il songolo provider.
Ciao

 End Sub
si questa è una soluzione solo che vorrei (se possibile) che l'oggetto
'conn' sia tipicizzato in automatico cioè quando io faccio dim conn as new
Connection l'oggetto conn deve diventare *automaticamente* oleDbConnection
oppure sqlConnection ecc.. spero di essermi spiegato.. si può fare?
GRAZIE