Gestire Funzioni come oggetti

Da Gambas-it.org - Wikipedia.

Funzioni e Procedure, presenti in Moduli o in Classi specifiche, possono essere gestite e chiamate come oggetti, siano esse interne alla medesima Classe (o Modulo) di quella della funzione chiamante, oppure poste in una Classe (o Modulo) diversa da quella della funzione chiamante.


Funzioni e Procedure poste all'interno della medesima Classe o Modulo della funzione chiamante

Si tratta di assegnare il nome identificativo della Funzione o della Procedura ad una variabile di tipo Oggetto, con la quale effettuare la chiamata con il metodo Object.Clall() .

Mostriamo un semplice esempio:

Public Sub Main()
 
 Dim i As Integer
 Dim ob As Object
   
  ob = MMAin
  
  i = Object.Call(ob, "Somma", [3, 4])

  Print i
  
End


Public Function Somma(a As Integer, b As Integer) As Integer   ' <--- La Funzione deve essere dichiarata come "Pubblica"
  
 Dim i As Integer
 
  i = a + b
 
  Return i
 
End


Funzioni e Procedure poste in altra Classe o Modulo

Il Modulo o la Classe specifica deve avere, come intestazione, la parola chiave "Create". Inoltre, le Funzioni e le Procedure, presenti in Moduli o in Classi specifiche, saranno rappresentate dal metodo speciale _call(), che viene appunto dichiarato quando l'oggetto è usato come una funzione.

Le sub-routine presenti in una Classe specifica, o in un Modulo, possono essere chiamate anche mediante il metodo Object.Call(). In tal caso non si utilizzerà il metodo speciale _call() .


Mostriamo un esempio, nel quale si avrà un applicativo composto anche da un Modulo e da una Classe specifica, ciascuno contenente una funzione.

Il Modulo, che chiamaremo Module1, sarà così scritto:

Create


Public Function _call(i As Integer) As Integer
 
  Return i * 10
 
End


La Classe specifica, che chiameremo Class1, sarà così scritta:

Create


Public Function _call(s As String) As String
 
  Return s & " 10 = "
 
End


Public Procedure ClSub()
 
  Print "Procedura chiamata con 'Object.Call()'"
 
End


Mentre la Classe principale dell'applicativo sarà la seguente:

Public Sub Form_Open()

  Chiamata(Class1, Module1)

End


Public Procedure Chiamata(obCl As Object, obMod As Object)

  Dim i As Integer
  Dim s As String
  
   s = obCl("7 x")
   
   i = obMod(7)
   Print s; i


   Object.Call(obCl, "ClSub", Null)
   
End