Newsgroup: it.comp.lang.visual-basic
Titolo: costruttore della classe

Qualcuno sa dirmi come se esiste in visual basic il costruttore di una
classe?
Ad esempio in java si costruisce un metodo con lo stesso nome della classe,
so che in visual basic c'è l'evento initialize, ma mi pare che non posso
passargli dei parametri, che invece è quello che occorre fare a me.
Mi sapete aiutare?
Grazie
Andrea

classe?
]zac[

 ha scritto nel messaggio
news:SL8i6.62744$GM6.2...@news.infostrada.it...


 passargli dei parametri, che invece è quello che occorre fare a me.
Non si puo' fare.
Dice che sara' possibile dalla prossima versione di vb...

Dice che sara' possibile dalla prossima versione di vb...
]zac[

 Ma guarda che sorpresa!!
qua va a finire che non si potranno neppure scrivere i
commenti nei sorgenti :)
--
Fibia "Sakamoto" FBI
E-mail: 
fibi...@hotmail.com
ICQ UIN 63586057
Sito Personale: 
http://www.geocities.com/fibiafbi
VB Simple: 
http://vbsimple.virtualave.net
Membro #25 delle Mitiche Brigate Takahashi sezione Sud

 ha scritto nel messaggio
news:96b4il$470$1...@sun250.unimi.it...


commenti nei sorgenti :)
]zac[


[...]

default, a volte non parte...
Stai scherzando, vero?
Quello che dici è impossibile (per lo meno non l'ho mai riscontrato, e io di
classi ne uso parecchie).
Ciao


In che senso ? Class_Terminate _non_ e' un distruttore, ma, giustappunto,
un evento che potrebbe non verificarsi, specie se ci sono dei riferimenti 
incrociati con altri oggetti e si confida piu' del dovuto nella pulizia
di vb.
Ciao
Aldo


Ho seguito un po' di tempo fa un thread sull'argomento su un Ng Ms, a cui
hanno partecipato persone veramente molto competenti, ed inoltre era
successo anche a me.
In generale le conclusioni sono:
1) Non ci sono bug noti di VB sull evento Class_terminate. Lo genera sempre.
2) Il caso più frequente in cui non viene generato è che ci sia un on error
resume next non gestito, nel qual caso il controllo viene passato alla
routine precedente nello stack delle chiamate in modo brutale.
3) Potrebbe anche capitare che usando new, o avendo fatto qualche
assegnamento dell'istanza ad un'altro oggetto la classe esista ancora,
sebbene si pensi il contrario (qui non mi è tutto ben chiaro, infatti se
assegna all'oggetto nothing secondo me dovrebbe comunque generare l'evento).
Ciao
Alfonso Moscato

Io arrivo dal mondo C++. Anche se sono un paio d'anni che non lo vedo mi
ricordo un po' tutto...
in C++ se si metteva il metodo ~nome_classe nella classe veniva eseguito
quando la variabile oggetto usciva dal suo campo di usabilità (o era
visibilità). Si chiamava distruttore.
Con VB c'è il class_terminate che TI GIURO da me a volte non parte. Ti sto
parlando di progetti VERAMENTE corposi, abbiamo messo su una tonnellata di
classi. Ci sono talmente tanti riferimenti incrociati e bordelli vari che
anche noi facciamo casino. E ti giuro, il class_terminate a volte non ne
vuol sapere di partire! Forse Alfonso ha ragione. Devo ristudiarmi
l'argomento...
CiaoZ
SebaMix
[...]

 a volte non ne vuol sapere di partire! Forse Alfonso ha ragione.
Suppongo che il Garbage Collector utilizzi un meccanismo di Reference
Count per decidere se e quando distruggere l'oggetto. Questo puo'
portare, nel caso di classi con molti riferimenti incrociati (come nel
tuo caso) alla non distruzione della classe (e quindi non viene
scatenato l'evento Class_Terminate) perche' ci sono ancora riferimenti
attivi alla classe. Bisognerebbe rivedere un po' la struttura del
programma.
Ciao.

 A testate?!?
Se il problema č quello di passare un argomento all'evento inizialize
l'ostacolo puo' facilmente essere aggirato... esistono appunto le proprietą.
Il VB crea l'oggetto nel momento in cui si accede ai suoi membri. Quindi
nella LET della proprietą basta inserire il codice di inizializzazione (se
tale codice deve per forza processare un argomento).
PS
Le testate servono a poco.

cui verra' chiamato.
Ok, però se io la classe la instanzio con l'early binding (Set MiaClasse =
New TMiaCalsse) e la distruggo _io_ (cosa che andrebbe fatta *sempre*)
problemi non dovrebbero essercene.
Certo che, se io dichiaro classi con Dim MiaClasse as New TMiaClasse, e poi
ci creo riferimenti incrociati con altre classi, o altre var che puntano
alla stessa istanza, non le distruggo, le ricreo senza sapere se ci sono
ancora o no... beh... qui può succedere di tutto.
Ciao

 problemi non dovrebbero essercene.
Il fatto e che in un linguaggio che utilizza La Garbage Collection (Vb,
ma anche Java ed altri) non hai nessuna possibilita' di distruggere la
classe.
Il Set MiaClasse = Nothing non la distrugge ma segnala al Garbage
Collector (decrementando il reference count) che la classe puo' essere
distrutta. Ma quando questo avvenga (e, a volte, SE questo avvenga) non
e' possibile saperlo.
Ciao.

sarebbe un linguaggio facile...
Se fossero come in Javascript non sarebbe affatto difficile:
function myclass(init_property1, init_property2){
    // aggiungere nuovi membri ad una classe è facilissimo:
    // basta accedere ad un membro non esistente e, anzichè
    // un'antipatica access violation, otterremo che il membro
    // verrà aggiunto alla classe e inizializzato. Le property
    // sono una tragedia greca, da scordarsi le property
    // get/let/set di VB, qui si fa tutto a membri pubblici e
    // funzioni, purtroppo. Ma pare che qualcosa si stia
    // muovendo in questo senso, in JScript.Net
    this.property1 = init_property1;
    this.property2 = init_property2;
    // funzioni anonime - Javascript ha anche questo
    // Ha una sintassi molto flessibile, non ai livelli
    // del Perl ma consente già di fare qualsiasi cosa ti
    // passi per la testa, praticamente
    this.method1 = function (foo, bar){
        return this.property1 * foo + bar;
    }
    // Un evento non è altro che un dato di tipo Function
    // Lo inizializziamo per evitare errori nel caso l'evento
    // non venga gestito, assegnandogli una funzione lambda
    // molto semplice che si limita a restituire 0;
    this.event1 = new Function("return 0;");
    // allochiamo e inizializziamo al volo una variabile
    // (ci sarà molto difficile far digerire un simile abominio
    // al compilatore, ma l'interprete non farà una piega)
    // Notare l'uso dell'operatore di assegnazione in
    // un'espressione condizionale
    if(var what = somethingCoolHappened()){
        // qui stiamo scatenando un evento richiamandone l'handler
        // Notare lo switch-case ereditato dal C e il typecast in
        // stile Pascal
        switch(Boolean(this.event1(what))){
            case true: /* they enjoyed it */;
            case false: /* they didn't like it */;
        }
    }
}
di una semplicità e un'immediatezza disarmanti. Per creare questa classe 
basta un
    var myinst = new myclass(10, 'foo');
che, notare bene, è un vero e proprio costruttore parametrizzato
richiamare un metodo?
    var res = myinst.method1(34, 11);
binding di un evento? (abbastanza inutile a causa della natura 
strettamente lineare di Javascript, ma sappiate che si può fare anche 
questo...)
    myinst.event1 = myhandler;
    function myhandler(param1, param2){
    }
Il problema? non hanno distruttore. Ahimè. Ma in teoria basterebbe 
giocare un po' sul prototipo dell'oggetto Object, e introdurre ad 
esempio la convenzione che per terminare una classe dobbiamo richiamare 
un suo ipotetico metodo free(), che la classe provvederà ad assegnare ad 
una sua funzione interna... diciamo che Javascript è molto, ma molto più 
OOP di Visual Basic... e riesce a non essere ostico per i principianti
-- 
January 15, 2028 - Intel announces their new 400THz processor, which 
performs 100 billion floating-point operations in the millisecond before 
it consumes itself in a nuclear explosion. This is a step up from AMD's 
recent processor which simply fries any nearby user with bolts of plasma 
energy. Hobbyists are already looking into ways to overclock the chip.

Guarda che ti sbagli. Il Vb non ha un garbage collector. Ce lo avrà Vb.Net
(anzi per la precisione il Commom Language runtime). Queelo che si limita a
fare Vb è inserire nel compilato, quando una oggetto esce di scope, del
codice che controlla il numero di riferimenti e se è=0 distrugge l'ooggetto.
Da qui la vecchia polemica sulle ncessità o no di mettere Set Oggetto=
nothing alla fine della routine. Io lo metto, però ho letto delle
argomentazioni molto valide sulla stupidità di farlo (è come se uno
rimettesse a 0 tutte le vairabili int prima di uscire dalla routine).
Comunque se ti vai a cercare un po' di vecchi thread su
microsoft.public.vb.com
 potrai trovare delle spiegazioni veramente molto
esurienti.
Ciao
Alfonso Moscato
"H.P.L." <u...@vailla.ble> ha scritto nel messaggio
news:lCCi6.20822$mD1.4...@news.infostrada.it...
[...]


argomentazioni molto valide sulla stupidità di farlo
]zac[
Cerchiamo di capirci e capire.
Vb provvede a distruggere i propri oggetti (quelli creati da lui) con
un'ottima precisione.
Tutte le volte che ho visto nascere dei problemi di non scaricamento degli
oggetti era dovuto ad errori grossolani di programmazione (es. unload form1
e poi si accede alle proprieta' del form o alle variabili dichiarate nel
form (col risultato di far ricaricare il form).
Vorrei proprio vedere un codice (sorgente, non con activex di terze parti
che non si sa' che cosa fanno) in cui gli oggetti non vengono scaricati e
non ci sia un evidente errore di programmazione.
Salve
                Dbg

 non ci sia un evidente errore di programmazione.
Approvato e sottoscritto. Di 100 volte che sento dire "saranno i driver",
"sarà un bug di Windows", "perchè non controlliamo la ram" ed altre amenità
del genere, di solito in un caso è un problema esterno. Negli altri 99 sono
errori del programmatore.
Programmatori, vil razza dannata!
Ciao
Alfonso Moscato

Programmatori, vil razza dannata!
Nel caso delle classi (e poche altre cose) si, concordo in pieno, sono
piuttosto ben realizzate
Negli altri casi e' anche colpa (spesso molta) di chi lascia trabocchetti a
piene mani.
Se una cosa e' complicata, non prevede azioni 'automatiche' di pulizia o di
emergenza, beh poi e' logico che tanti facciano cavolate.
Salve
            Dbg

Certo che e' possibile, se termini con End, ad esempio  >:-]
Ma tu m'insegni che per fermare la macchina non si dovrebbe schiantarsi
contro il muro... :)
Ciao

 veramente molto esurienti.
Ho dato uno sguardo (veloce) ma devo dire che i pareri sono un po'
troppo discordi per riuscire a capire bene quale sia l'effettiva
situazione.
Ciao.

 cosa che sfugge alla mia comprensione.
Come ho gia' scritto non mi risulta ci fossero altre possibilita', se
non quelle di lasciare il compito al programmatore.
Ciao.

 algoritmi), li elimina ed in seguito deframmenta la memoria.
quanto a me, confermo tutto quello scritto da H.P.L.
dalla conoscenza su GC e da quello riguardante java.
quindi VB non ha un GC, se esso e' definito nei canoni in cui
si manifesta con java.
