Clases: Como Clonar Un Object De Una Clase Que No Conocemos?


Goto page 1, 2  Next

Subject: Clases: Como Clonar Un Object De Una Clase Que No Conocemos?
El problema:
Obtener un New objeto que sea igual que el referenciado, tanto en su clase como en todas sus variables y propiedades. O sea, un clon pero en otra posicion de memoria.

Public c1 as New Clase1
Public c2 as New Clase2 ' Son todas distintas
Public c3 as New Clase3
Public c4 as New Clase4


Public Sub ClonMe(original as Object) as Object

' un nuevo objeto igual al original
?????

End

Last edited by tercoIDE on Thursday, 23 April 2020, 16:42; edited 1 time in total
Profile PM  
Subject: Re: Clases: Como Clonar Un Object De Una Clase Que No Conocemos?
tercoIDE:
Mirate esto: http://sologambas.blogspot.com/2014...ar-objetos.html

A ver si te sirve...

Saludos

Julio

Subject: Re: Clases: Como Clonar Un Object De Una Clase Que No Conocemos?
jsbsan escribió:  
tercoIDE:
Mirate esto: http://sologambas.blogspot.com/2014...ar-objetos.html

A ver si te sirve...

Yo supongo que no: ...tercoIDE en estos días está de humor para refinamientos "excesivos".

Last edited by vuott on Thursday, 23 April 2020, 19:57; edited 3 times in total
Profile PM  
Subject: Re: Clases: Como Clonar Un Object De Una Clase Que No Conocemos?
tercoIDE escribió:  
El problema:
Obtener un New objeto que sea igual que el referenciado, tanto en su clase como en todas sus variables y propiedades. O sea, un clon pero en otra posicion de memoria.

Public c1 as New Clase1
Public c2 as New Clase2 ' Son todas distintas
Public c3 as New Clase3
Public c4 as New Clase4


Public Sub ClonMe(original as Object) as Object

' un nuevo objeto igual al original
?????

End

Me parece que tú quieres obtener, crear un Objeto "c5" pero sin la sintaxis "As New .....", sino obteniéndolo del Objeto pasado a la función, como modelo, como base.

De todos modos yo te respondo con otra pregunta: ¿desde el punto de vista del bajo nivel, qué significa crear un Objeto, una instancia de una Clase?

Last edited by vuott on Thursday, 23 April 2020, 19:44; edited 1 time in total
Profile PM  
Subject: Re: Clases: Como Clonar Un Object De Una Clase Que No Conocemos?
jsbsan escribió:  
tercoIDE:
Mirate esto: http://sologambas.blogspot.com/2014...ar-objetos.html

A ver si te sirve...

Saludos

Julio



No funciono porque la clase tiene un array de otro clase menor


' SAVE from this
Public P As New Punto[] ' acumulador de puntos
Public Level As Float ' from 0 to 1

' For future use in CAD implementation
Public Layer As Integer ' Capa o Layer
Public Group As Integer ' Para tener la posibilidade de juntar cosas en un grupo
Public _Color As Integer ' Para darle un color distinto al del layer
Public LineType As Integer
Public LineWidth As Integer


La variable P es un array de clase Punto. La rutina que me pasaste no puede procesar eso.

Profile PM  
Subject: Re: Clases: Como Clonar Un Object De Una Clase Que No Conocemos?
vuott escribió:  
[
Me parece que tú quieres obtener, crear un Objeto "c5" pero sin la sintaxis "As New .....", sino obteniéndolo del Objeto pasado a la función, como modelo, como base.

De todos modos yo te respondo con otra pregunta: ¿desde el punto de vista del bajo nivel, qué significa crear un Objeto, una instancia de una Clase?


Quiero crear una nueva instancia de un objeto del cual no conozco la clase y copiar todo el contenido.

No se como trabaja internamente gambas, pero tal vez un objeto sea una porcion de memoria con datos interpretables por GBX y tal vez, solo tal vez pueda ser copiado como eso, una porcion de memoria y asignada a un puntero de un objeto nuevo...tal vez...habria que meter la cabeza en el agujero como tu avestruz

Profile PM  
Subject: Re: Clases: Como Clonar Un Object De Una Clase Que No Conocemos?
tercoIDE escribió:  



' SAVE from this
Public P As New Punto[] ' acumulador de puntos
Public Level As Float ' from 0 to 1

' For future use in CAD implementation
Public Layer As Integer ' Capa o Layer
Public Group As Integer ' Para tener la posibilidade de juntar cosas en un grupo
Public _Color As Integer ' Para darle un color distinto al del layer
Public LineType As Integer
Public LineWidth As Integer


La variable P es un array de clase Punto. La rutina que me pasaste no puede procesar eso.



Este codigo funciona para mi caso particular. Pero tengo que meter los puntos a mano.
Estaria bien tener un codigo universal.

Public Sub Clone(hObjeto As Object) As Object
Dim SinPuntos As Object

SinPuntos = CopyElementObject(hObjeto)

' ahora meto los puntos a mano
Dim p2 As Punto

For Each p2 In hObjeto.p
SinPuntos.P.add(puntos.Add(p2.x, p2.z, p2.Level))
Next

SinPuntos.finish()


Return SinPuntos ' pero ahora tiene :)

End


Public Sub CopyElementObject(hObjeto As Object) As Object

Dim hNewMe As Object = Object.New(Object.Type(hObjeto)) 'se genera un objeto de la mismo tipo que nos pasan
Dim s As String 'variable utilizada para almacenar el valor de hclass.symbols
Dim hclass As Class = Object.Class(hObjeto) 'contiene el valor de la clase del objeto
Dim hChild As Object

Dim nuevoObjeto As Object
Dim caso As Integer 'tipo de dato de la propiedad del objeto

Dim contador, a As Integer 'para usarlo en bucle si son arrays
Dim arrayPosible As Object

'Inicio de la copia de las propiedades....
For Each s In hclass.Symbols
If s = "Chlidren" Then Continue
If Not hclass[s].ReadOnly Then ' esto se cumple cuando llego a P[0]
caso = TypeOf(Object.GetProperty(hObjeto, s))

Select Case caso
Case gb.Object
'la propiedad es un objeto, vuelvo a llamar a la funcion para que me extraiga los valores y no las referencias
nuevoObjeto = CopyElementObject(Object.GetProperty(hObjeto, s))
Object.SetProperty(hNewMe, s, nuevoObjeto)

Try contador = Object.GetProperty(hObjeto, s).count
If Error Then
'no es un array

Else
For a = 0 To contador - 1
nuevoObjeto.add(Object.GetProperty(hObjeto, s)[a])
Next
Endif

Default
'la propiedad no es un objeto, copio el valor
Object.SetProperty(hNewMe, s, Object.GetProperty(hObjeto, s))
End Select

Endif

Next

Return hNewMe

End

Profile PM  
Subject: Re: Clases: Como Clonar Un Object De Una Clase Que No Conocemos?
tercoIDE escribió:  
El problema:
Obtener un New objeto que sea igual que el referenciado, tanto en su clase como en todas sus variables y propiedades. O sea, un clon pero en otra posicion de memoria.

Los objetos collection se pueden copiar.
Por ejemplo.
Public Sub Form_Open()

Dim c1 As New Collection
Dim c2 As New Collection
Dim v As Variant

c1.Add("texto1", "clave1")
c1.Add("texto2", "clave2")

c2 = c1.Copy() 'Intercambiendo esta linea por la siguiente se ve el efecto 'Copy' y el efecto '='
'c2 = c1

c2.Add("texto3", "clave3")

Print "Collection 1 -----------"
For Each v In c1
Print c1.Key & ":" & v
Next
Print "\n"
Print "Collection 2 -----------"
For Each v In c2
Print c2.Key & ":" & v
Next

End

Saludos.

Profile PM  
Subject: Re: Clases: Como Clonar Un Object De Una Clase Que No Conocemos?
Esta función podria servir
Public Function MCopy(obj As Object) As Object

Dim oky As Object

oky = obj.Copy()

Return oky

End

Saludos.

Profile PM  
Subject: Re: Clases: Como Clonar Un Object De Una Clase Que No Conocemos?
tercoIDE escribió:  
... un objeto sea una porcion de memoria con datos interpretables por GBX

Exactamente, y esto lo hace el Constructor "New".
New construye las Estructuras y las sub-estructuras necesarias y previstas para dar vida al Objeto deseado, asignando la necesaria memoria.



tercoIDE escribió:  
Estaria bien tener un codigo universal.

Yo propondría el siguiente ejemplo:

Modulo principal
Public Sub Main()

Dim cl As New Class1
Dim clone As Object
Dim b As Byte

clone = ClonMe(cl)

' Verificación:
Print "Objeto \e[1mcl\e[0m = "; cl, "Objeto \e[1mclone\e[0m = "; clone
Print "\nSus recursos:"
For b = 0 To Object.Class(cl).Symbols.Max
Print "Objeto cl = "; Object.Class(cl).Symbols[b]; " "; "Objeto clone = "; Object.Class(clone).Symbols[b]
Next

Print clone.Adde(500)
Print clone.Subtrahe(500)

End


Public Function ClonMe(original As Object) As Object

Dim novum As Object

' Un nuevo objeto igual al original (por supuesto hace falta usar el Metodo "New"):
novum = Object.Class(original).New(Null)

Return novum

End



Clase secundaria: Class1.class

Last edited by vuott on Friday, 24 April 2020, 05:35; edited 3 times in total
Profile PM  
Goto page 1, 2  Next

Page 1 of 2


  
You cannot post new topics
You cannot reply to topics
You cannot edit your posts
You cannot delete your posts
You cannot vote in polls
You cannot attach files
You can download files
You cannot post calendar events

   

This is a "Lo-Fi" version of our main content. To view the full version with more information, formatting and images, please click here.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Generation Time: 0.169s (PHP: -1% SQL: 101%)
SQL queries: 27 - Debug Off - GZIP Enabled