Usare una Classe come fosse una Funzione: differenze tra le versioni
Vai alla navigazione
Vai alla ricerca
Nessun oggetto della modifica |
Nessun oggetto della modifica |
||
| Riga 1: | Riga 1: | ||
== Descrizione | == Descrizione == | ||
Versione attuale delle 17:40, 1 mag 2025
Descrizione
Per usare una classe oppure un oggetto alla stregua di una funzione ci avvarremo del metodo speciale '_call()' che serve appunto a tale scopo. [nota 1]
Esemplificheremo il tutto creando una classe CMat preposta a restituire il risultato di un'operazione matematica, il cui funzionamento è talmente semplice da rendere superflua ogni ulteriore spiegazione.
La routine chiamante istanzierà un nuovo oggetto e invierà al Metodo "_call()" le istruzioni atte a riceverne il corretto risultato di ritorno.
Sfrutteremo anche la parola chiave '...', qui meglio descritta che permette di passare un numero imprecisato di argomenti.
Il modulo Main.module chiamante:
Public Sub Main()
Dim Operazione As New CMat
With Operazione
Print Operazione(.Somma, 1.2, 2.0, 3.55, 4.0, 5.12)
Print Operazione(.Sottrazione, 12345, 45, 67, 890, 543, 987, 345, 1234, 4567)
Print Operazione(.Moltiplicazione, 32, 64, 12, 21)
Print Operazione(.Divisione, 1234, 56, 78, 93, 4)
End With
End
La classe funzione CMat:
Public Enum Somma, Sottrazione, Moltiplicazione, Divisione
Public Sub _call(Operator As Integer, ...) As Variant
Dim v As Variant = Param.All
Dim i, iType As Integer
Dim vResult As Variant = 0
If Param.Count = 0 Then Return
iType = TypeOf(v[0])
If iType = 4 Then
CLong(vResult)
Else If iType = 7 Then
CFloat(vResult)
Else
Message.Warning("Occorre inserire dei numeri")
Return
Endif
For i = 0 To Param.Max
If TypeOf(v[i]) <> iType Then
Message.Warning("Impossibile operare su tipi di dato diversi")
Return
Endif
Next
Select Case Operator
Case Somma
For i = 0 To Param.Max
vResult += v[i]
Next
Return vResult
Case Sottrazione
vResult = v[0]
For i = 1 To Param.Max
vResult -= v[i]
Next
Return vResult
Case Moltiplicazione
vResult = v[0]
For i = 1 To Param.Max
vResult *= v[i]
Next
Return vResult
Case Divisione
vResult = v[0]
For i = 1 To Param.Max
Try vResult /= v[i]
If Error Then
Message.Error(Error.Text)
Return
Endif
Next
Return vResult
End Select
End
Note
[1] Vedere anche queste pagine analoghe: