Dedicado a mis proyectos en Gambas ,un lenguaje de programación parecido al Visual Basic + Java pero ampliamente mejorado y...¡¡para gnu/linux!!.La potencia del gnu/linux sumada a la facilidad del Basic



Consultas, Desarrollo de programas y petición de presupuestos:



sábado, 3 de agosto de 2013

POO en Gambas3: Copiar Objetos

Programación Orientada a Objetos  
en Gambas3: Copiar Objetos


Alguna veces nos interesa hacer una copia de nuestros objetos en los programas.

Este lenguaje no trae ninguna función para hacer esto directamente, pero mirando en  las listas de usuarios de gambas (mailing gambas-user) y  en el gambasforce francés ( code-62-copier-un-controle-ou-un-conteneur-et-ses-enfants) viene un código capaz de copiar las propiedades y los hijos de un control.:


He modificado un poco el codigo, para que sea capaz de copiar Objetos (sus propiedades y métodos), y además le he añadido que si una propiedad es otro objeto, también lo copie (haga un nuevo objeto y copie el valor, y no lo copie por referencia, que es lo que hace el codigo frances con todas las propiedades).

Os pongo aqui él código de la función.


Ejemplo de uso:

Tenemos dos clases:
ClassPata:
     Es una clase que tiene una sola propiedad: Numero
ClassPerro:
     Donde tiene varias propiedades:
                  arrayInteger As Integer[]
                  varian As Variant
                  N As ClassPATA
                  nombre As String






La salida que se genera en la ejecución del ejemplo es la siguiente:
1) Copia del objeto perro a copiaperro
Original:.......................
Nombre: nazarena
patas: 3
Varian:         (String[] 0xf5b5b8)  valores: hola adios
Array integer:  (Integer[] 0xf5b6e8)
(Id:0: 1) (Id:1: 2) (Id:2: 4) (Id:3: 56)
La copia incial es:
Nombre: nazarena
patas: 3
Varian:         (String[] 0xf5bb48)  valores: hola adios
Array integer:  (Integer[] 0xf5bfc8)
(Id:0: 1) (Id:1: 2) (Id:2: 4) (Id:3: 56) 
2) Hacemos una modificación de la copia, y comprobamos que no se ha modificado el original
copia modificada: -------------
Nombre: Canela
patas: 4
Varian:         (Variant[] 0xf5b4b8)  valores: Hello adios Bye Bye perrito 3,14
Array integer:  (Integer[] 0xf5bb48)
(Id:0: 10) (Id:1: 22) (Id:2: 3) (Id:3: 4) (Id:4: 34)
El original es:
Nombre: nazarena
patas: 3
Varian:         (String[] 0xf5b5b8)  valores: hola adios
Array integer:  (Integer[] 0xf5b6e8)
(Id:0: 1) (Id:1: 2) (Id:2: 4) (Id:3: 56)

3) Ahora modifico el original, y compruebo que la copiamodificada no se ha modificado con este ultimo cambio
Modifico Original, veo si ha cambiado en algo la copiaModificada....
El original Modificado es:

Nombre: nazarena Raza desconodia
patas: 8003
Varian:         (String[] 0xf5b508)  valores: Alfa Beta
Array integer:  (Integer[] 0xf5b5b8)
(Id:0: 1) (Id:1: 2) (Id:2: 43) (Id:3: 56)
Copia Modificada anteriormente:
Nombre: Canela
patas: 4
Varian:         (Variant[] 0xf5b4b8)  valores: Hello adios Bye Bye perrito 3,14
Array integer:  (Integer[] 0xf5bb48)
(Id:0: 10) (Id:1: 22) (Id:2: 3) (Id:3: 4) (Id:4: 34)


4) Y ya por ultimo, lo que hago es mostrar los nombre internos de las variables (arrays y clases) que intervienen en el ejemplo:
Muestro las referencias de los objetos:
objetos:(ClassPerro 0xf6d318)   (ClassPerro 0xf6d368)
clases:(ClassPATA 0xf5b488)     (ClassPATA 0xf5bb18)
Arrays Integer:(Integer[] 0xf5b5b8)     (Integer[] 0xf5bb48)
Arrays Variant:(String[] 0xf5b508)      (Variant[] 0xf5b4b8)

Con estos ejemplos, podeis comprobar que los propiedades de los objetos ( los arrays, variant, clases, etc), se han copiado por valor, cuando normalmente se copian por referencia.


Enlace de descarga del ejemplo completo: enlace de descarga

Nota:
Si se copia por Referencia una variable, lo que ocurre, que cualquier cambio producido en esta modifica todos los objetos que la tienen por referencia.
Si se copia por Valor una variable, se se modifica, solo afecta al objeto donde este, quedando el objeto original igual.



Nota 2:
Esta función copia tanto las propiedades como los métodos que tenga el objeto.
No copia variables publicas (Public) definidas dentro del objeto, ni por supuesto las definidas como privadas (Private)