¿Quiere una forma simplificada de utilizar objetos compartidos, siguiendo la sintaxis clásica de los objetos y llamando automáticamente a use/end use cuando sea necesario?
Abróchese el cinturón; ¡aquí vienen las clases compartidas!
Creación y gestión de clases compartidas
Con 4D 20 R5, hemos añadido un nuevo concepto: las clases compartidas.
Las clases compartidas sólo pueden utilizarse para crear objetos compartidos y, como tales, simplifican su uso. Para crear una clase compartida, basta con añadir la palabra clave shared a su constructor:
//class SharedClass
shared Class constructor()
Las clases compartidas no pueden utilizarse para crear objetos estándar: cada vez que llame a new() para crear un nuevo objeto de esta clase, será un objeto compartido.
Extensión PARa las funciones de clase
La palabra clave shared también puede utilizarse para las funciones de clase, indicando que esta función modifica el objeto. No es necesario llamar a use y end use dentro de la función, ya que se llaman automáticamente cuando se llama y se sale de la función. Esto es obviamente válido para el constructor singleton.
shared Function myFunction()
This.attribute:="whatever"
Por supuesto, debe tener cuidado cuando utilice la palabra clave shared para funciones que no la necesitan para evitar bloquear otros procesos que intenten usar el objeto.
El uso apropiado de clases y funciones compartidas debería permitirle manipular sus objetos compartidos como si fueran objetos normales, simplificando su código.
Consideraciones sobre la herencia
Un último punto con el que debe tener cuidado es que las clases no compartidas pueden heredar de clases compartidas, pero las clases compartidas no pueden heredar de clases no compartidas. Por lo tanto, planifique su modelo objeto en consecuencia.
Ejemplo
Supongamos que tiene que realizar un cálculo largo, y prefiere utilizar un worker para evitar bloquear sus procesos importantes. Pero, obviamente, necesita recuperar el resultado del cálculo en algún momento. Utilicemos esta clase CalculationResult:
// class CalculationResult
shared Class constructor()
This.isFinished:=False
Function makeCalculation()
...
This.finished:=True
shared Function set finished($finished : Boolean)
This.isFinished:=$finished
shared Function get finished()->$finished : Boolean
$finished:=This.isFinished
Para usarla, sólo tiene que hacer:
$calculation:=cs.CalculationResult.new()
CALL WORKER("AnyWorker"; Formula($calculation.makeCalculation()))
While (Not($calculation.isFinished))
//Code that will be executed while the calculation is in progress
End while
Espero que las clases compartidas le ayuden a utilizar objetos compartidos en su aplicación. Si tiene alguna pregunta, no dude en llevarla al foro de 4D.