Usare una Classe come fosse una Funzione
Vai alla navigazione
Vai alla ricerca
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.
Esemplificheremo il tutto creando una classe CMat preposta a restituire il risultato di un'operazione matematica.
La routine chiamante istanzierà un nuovo oggetto e invierà al metodo _call() le istruzioni atte a riceverne il corretto risultato di ritorno.
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