Differenze tra le versioni di "Usare una Classe come fosse una Funzione"

Da Gambas-it.org - Wikipedia.
 
(Una versione intermedia di uno stesso utente non è mostrata)
Riga 7: Riga 7:
 
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.
 
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.
+
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 ''''...'''', [https://www.gambas-it.org/wiki/index.php?title=Passare_a_una_funzione_un_numero_imprecisato_di_argomenti qui] meglio descritta che permette di passare un numero imprecisato di argomenti.
 
Sfrutteremo anche la parola chiave ''''...'''', [https://www.gambas-it.org/wiki/index.php?title=Passare_a_una_funzione_un_numero_imprecisato_di_argomenti qui] meglio descritta che permette di passare un numero imprecisato di argomenti.
  
 
== Il modulo Main.module chiamante: ==
 
== Il modulo Main.module chiamante: ==
 
 
 
   Public Sub Main()
 
   Public Sub Main()
 
    
 
    
Riga 90: Riga 88:
 
=Note=
 
=Note=
 
[1] Vedere anche queste pagine analoghe:
 
[1] Vedere anche queste pagine analoghe:
* [[Gestire_Funzioni_come_oggetti|Gestire Funzioni come oggetti]]
+
* [[Gestire Funzioni come oggetti]]
* [[Emulare_i_Puntatori_a_Funzione_del_linguaggio_C_mediante_gli_Oggetti|Emulare i Puntatori a Funzione del linguaggio C mediante gli Oggetti]]
+
* [[Emulare i Puntatori a Funzione del linguaggio C mediante gli Oggetti]]

Versione attuale delle 07:58, 19 ott 2024

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: