Usare una Classe come fosse una Funzione
Da Gambas-it.org - Wikipedia.
Versione del 1 gen 2021 alle 06:29 di Gianluigi (Discussione | contributi) (Creata pagina con " == Descrizione: == Per usare una classe oppure un oggetto alla stregua di una funzione ci avvarremo del metodo speciale [http://gambaswiki.org/wiki/lang/special/call?l=it '...")
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