Istanziare un form passando il tipo

mercoledì 13 febbraio 2008 - 16.20

Cuky Profilo | Newbie

Ho creato un form che ovviamente eredita dalla classe Form
Supponiamo:

public myclass : Form

Passando ad un'altra classe il tipo(myclass) è possibile creare nuove istanze? Come?

Grazie!

aiedail92 Profilo | Expert

Certo che è possibile (almeno finchè lo dichiari public)

myclass istanza = new myclass();

Luca

Cuky Profilo | Newbie

Allora com'è che faccio a passare il tipo nei parametri della funzione?

void funzionericevente (type tip)

nella classe chiamante:

funzionericevente (myclass)

Non credo sia giusto...

aiedail92 Profilo | Expert

Allora, tu hai dichiarato una void (pubblica e non statica) nella classe myclass, e adesso vuoi richiamarla da un'altra classe giusto?
E a questa void devi passare dei parametri.

Per fare ciò, dopo aver istanziato la classe, devi chiamare la void dall'istanza (fintanto che la void non è statica) e passare come argomenti delle istanze del tipo richiesto.

Quindi se tu avessi una ipotetica

public void funzione(double d) { //Fai qualcosa }

nella classe myclass, per accedere a questa void dalla classe chiamante devi fare così:

class Chiamante { void FunzioneChiamante() { myclass istanzadimyclass = new myclass(); //L'argomento deve essere un double istanzadimyclass.funzione(2); } }

É tutto chiaro? Se no mi spiego meglio

Luca

Cuky Profilo | Newbie

In realtà mi sono spiegato male io.

Sto scrivendo una libreria di classi. Una di queste classi di libreria (LibraryClass supponiamo) deve istanziare periodicamente una classe che gli viene passata nel costruttore (questa classe da istanziare periodicamente rappresenta un form in realtà, supponiamo myForm).
Se gli passo un riferimento ad un'istanza quando il form viene chiuso non posso richiamare quel riferimento.

Se non mi sono spiegato bene (per favore) dimmelo...



aiedail92 Profilo | Expert

Vediamo se ho capito...

Tu devi passare come argomento ad una classe il tipo di una classe (quindi la classe stessa), non un'istanza della classe.

Quindi risultano molto utili i generici (mai sentito parlare? )

La tua LibraryClass la definisci generica in questo modo:

class LibraryClass<T> where T : new() { }

<T> sta ad indicare che la classe è generica. "where T : new()" indica che T deve possedere un costruttore che non richiede parametri (indispensabile per potere inizializzarne una variabile).

Adesso nella tua classe chiamante, quando dichiari una variabile di tipo LibraryClass devi passare anche il tipo al quale associare il generico, nel tuo caso myclass:

LibraryClass<myclass> libClass = new LibraryClass<myclass>();

In questa istanza di LibraryClass, il tipo generico T si comporterà esattamente come myclass.

É possibile definire altri vincoli per il tipo generico, come l'obbligo di derivare da una classe o da un'interfaccia, separandoli fra loro con delle virgole:

...<T> where T : Form, IComparable, ...

Luca

Cuky Profilo | Newbie

Si esatto era di questo che avevo bisogno...
Nel frattempo ero arrivato a capire di usare i tipi generici ma non sapevo di poter utilizzare le condizioni del costruttore e delle interfacce (fondamentali per risolvere il mio problema).
Mille gratias Luca!


Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5