Differenze tra le versioni di "Usare una Classe come fosse una Funzione"
Da Gambas-it.org - Wikipedia.
(2 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 3: | Riga 3: | ||
− | 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 '_call()'] che serve appunto a tale scopo. | + | 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 '_call()'] che serve appunto a tale scopo. <SUP>[[[#Note|nota 1]]]</sup> |
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 | + | 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 85: | Riga 83: | ||
End | End | ||
+ | |||
+ | |||
+ | |||
+ | =Note= | ||
+ | [1] Vedere anche queste pagine analoghe: | ||
+ | * [[Gestire Funzioni come oggetti]] | ||
+ | * [[Emulare i Puntatori a Funzione del linguaggio C mediante gli Oggetti]] |
Versione attuale delle 06: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: