Usare una Classe come fosse una Funzione

Da Gambas-it.org - Wikipedia.

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: