Usare una Classe come fosse una Funzione
Da Gambas-it.org - Wikipedia.
Versione del 11 gen 2021 alle 14:52 di Gianluigi (Discussione | contributi)
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, 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