Creare una classe

venerdì 29 ottobre 2004 - 20.50

forno Profilo | Junior Member

Ciao a tutti, ho problemi nella creazione di una mia classe personalizzata. Ovvero, come devo fare per ottenere delle funzioni da inserire dopo la classe? Tipo: MaiClasse.MiaFunzione(Value, Value)??

GvnnRules Profilo | Senior Member

Prima crei la tua classe MaiClasse.vb

Public class MaiClasse
Public Sub New()

End Sub

Public Function MiaFunzione(ByVal Value1 As String, ByVal Value2 As String) As String
Return Value1 & "-" & Value2
End Function
End Class

e poi richiami la funzione dalla tua form

Dim myObj As New MaiClasse()
Console.WriteLine(myObj.MiaFunzione("Pippo","Pluto"))

ciaoz
Gvnn

forno Profilo | Junior Member

Grazie

alextyx Profilo | Expert

Se la tua classe serve da libreria di funzioni, puoi valutare la possibilità di dichiarare tali funzioni 'shared', il che ti eviterà l'incombenza di dover instanziare la classe per utilizzarle. Un esempio sono i metodi del namespace 'math': math.round......
Se nn erro, se la tua sub new dovesse essere vuota, potresti anche ometterla in quanto verrebbe utilizzato un costruttore di default, ma sto andando a memoria e potrei sbagliarmi....provare x verificare!:-)

forno Profilo | Junior Member

Sinceramente: non ho capito! A me serve una libreria comune per diverse applicazioni!

alextyx Profilo | Expert

Anch'io uso qualcosa di simile. Quello che ti stavo dicendo, nn differisce motlo da queanto già detto prima, nello stesso thread. Volevo evitarti quello che accadde a me, cioè che pur potendo evitare la istanziazione della classe, per ignoranza, mi misi a creare oggetti ovunque avessi necessità di un metodo esposto dalla classe. In casi come il mio e forse come il tuo, basta dichiarare le funzioni come 'shared' e nn dovrai creare l'istanza della classe, cioè nn dovrai chiamare il metodo costruttore (New). Se comunque tu avessi bisogno di creare un'istanza, ma nn hai niente di particolare da scrivere nel metodo new, mi sembra di ricordare che tu possa ometterlo nella tua classe. I miei, in pratica, erano solo suggerimenti di 'ottimizzazioni', ma se ti creano confusione, forse è meglio che tu nn ti ci perda. Ricordati, comunque, che se istanzi la classe e quindi crei un oggetto, hai anche la rottura di scatole di ricordarti di distruggerlo. Ciao e buon lavoro :-)

schifidus Profilo | Junior Member

Mi sembra che stiate facendo un pò di confusione...
Allora per non dover istanziare una classe o un metodo lo devi dichiarare static...
Statico stà appunto ad indicare che tale oggetto non necessita di essere istanziato (attraverso la keyword new) e quindi è disponibile a priori.
Un metodo statico può quindi essere considerato una sorta di "costante".
Il problema che mi sembra tu voglia evidenziare è quello dell'incapsulamento.
Cioè il fatto che un metodo sia o meno visibile al'esterno della classe.
Per renderlo visibile lo devi dichiarare public altrimenti se vuoi che tale metodo o proprietà siano visibili e di conseguenza utilizzabili solo da oggetti interni alla classe lo devi dichiarare private.
Ciao Marco

ares99 Profilo | Newbie

Bimbi..

... Mi sa che DOVETE DIMENTICARE VB6 e dovete leggervi un po di documentazione
sulla programmazione ad OGGETTI

questa mia non vuole essere una critica .. assolutamente..ma un consiglio

NON ANDATE A TENTONI..

un po di pazienza e si fa tutto

alextyx Profilo | Expert

Static???
Sicuro della sintassi?
A parte la parola chiave, che mi sembra assomigli a qualcosa tipo 'C', probabilmente nn mi sono espresso bene, ma condivido tutto il resto. In effetti anch'io fui portato alla creazione di classi proprio per una questione di incapsulamento. Siccome, nonostante l'opinione di Ares, nn vengo da VB6, ma dall'assembly, ero assolutamente digiuno delle possibilità offerte dalle classi e dato che stavo al momento leggendo il capitolo sulla creazione delle stesse, fui illuminato dall'argomento e capii che avrebbe contribuito nn poco a mettere ordine in un modulo zeppo di procedure. Poi riflettendo a posteriori, mi resi conto che una buona parte delle classi create, era in effetti poco più che una raccolta di procedure che avrei potuto tranquillamente utilizzare senza dover instanziare la classe stessa e, salvo errori, per ottenere tale risultato, la funzione deve essere dichiarata 'shared' . Questo era il concetto primario che volevo passare. Probabilmente nn sono riuscito a farmi capire e me ne scuso. Comunque, se la mia osservazione può essere utile e 'finalmente' comprensibile, me ne compiaccio, altrimenti presumo che la cosa migliore sia ignorarla, dato che sopravviverete tutti anche instanziando inutilmente una classe! :-)

Integro comunque con un estratto del primo risultato che mi dà la ricerca della parola 'shared' utilizzando l'help in linea:

È possibile utilizzare la parola chiave Shared per indicare che uno o più elementi di programmazione dichiarati sono condivisi. Gli elementi condivisi non sono associati a un'istanza specifica di una classe o di una struttura. È possibile accedere a tali elementi qualificandoli con il nome di classe o di struttura oppure con il nome di variabile di un'istanza specifica della classe o struttura.

La parola chiave Shared viene utilizzata nei seguenti contesti:

Istruzione Dim

Istruzione Event

Istruzione Function

Istruzione Property

Istruzione Sub

.....se poi Ares vuole contribuire ad illuminarci e a rischiarare la notte che ci avvolge con ulteriori contributi, ben venga. Nel frattempo, come d'uso, la sua opinione è comunque stata registrata sul giornale di bordo ! ;-))

ares99 Profilo | Newbie

Non pensavo di alzare un polverone..!!

Il paradigma di programmazione ad oggetti si basa su concetti fondamentali, che erano teorici , ma che col passar del tempo sono divenuti PRATICI, ( intendo che i linguaggi si sono plasmati con la teoria ) vedi per esempio JAVA o .NET ( VB.NET C#) che SONO FORTEMENTE TIPIZZATI

nel caso Specifico:

Il problema proposto da forno .. è stato risolto da Gynn.. ( infatti se lo esegui funziona )

ma concettualmente è giusto??

1) devo considerare che in OOP non esistono funzioni ( anche se le chiamiamo cosi ) ma esistono metodi che espongono gli oggetti!

tanto per farvi un esempio ( CONCETTUALMENTE ) che senso ha una classe che chiamo Messaggio che
abbia al suo interno una funzione SHARED ( STATICA ) ossia che VIENE CONDIVISA DA TUTTI GLI OGGETTI DI QUELLA CLASSE ..! che mi faccia la Somma di Interi?? !!


Mi dispiace di essere stato frainteso.. se qualcuno si è offeso voglia accettare le mie scuse!

Volevo solo sottolineare la potenzialità della programmazione ad oggetti.. che non era stata sfruttata.. :)

come avere una Ferrari e andare ad 80 km/h

un SALUTO SINCERO A TUTTI!







alextyx Profilo | Expert

Caro Ares, l'esempio che ho portato, infatti, era proprio quello delle varie 'math.', che praticamente sono tutti metodi condivisi.
Non mettere in imbarazzo i programmatori della Microsoft. Magari se le hanno fatte erano convinti, pur sbagliando, ma in perfetta buona fede, che servissero pure a qualcosa! :-)
Sono d'accordo che la classe espone un'interfaccia di proprietà, metodi ed eventi. Tali metodi vengono dichiarati con parole chiave differenti a seconda che restituiscano un risultato (Function) oppure no (Sub). Ho continuato ad adottare la terminologia con cui è stato aperto il thread e che parlava di inserire delle 'funzioni', cioè quei metodi che restituiscono un valore.

Comunque, per riferirmi alla tua precisazione, forse abbiamo esperienze diverse, perchè tu scrivi:

tanto per farvi un esempio ( CONCETTUALMENTE ) che senso ha una classe che chiamo Messaggio che
abbia al suo interno una funzione SHARED ( STATICA ) ossia che VIENE CONDIVISA DA TUTTI GLI OGGETTI DI QUELLA CLASSE ..! che mi faccia la Somma di Interi?? !!

Io direi che un metodo 'shared' è disponibile anche senza creare un'istanza della classe e può essere utilizzato, anche da altre istanze di altre classi e nn solo da quelle della stessa classe, vincolo imposto, salvo sviste, dalla parola chiave 'Protected'.

Sono d'accordo con te sul fatto che una variabile dichiarata 'shared', è in effetti 'trasversale', nel senso che ha lo stesso valore in qualunque istanza della sua classe.
Una 'static', invece, che può essere dichiarata a livello di procedura, mantiene il valore tra successive chiamate della procedura (qui forse ci sono delle trappole, perchè credo che in altri linguaggi i termini abbiano significati ben diversi) e addirittura le due parole chiave Static e Shared, se ben ricordo, sono incompatibili tra loro.
Ma forse è solo un ingarbugliamento di termini che ci sta fuorviando!?
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