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


Ir a la página 1, 2  Siguiente

Objetivo: 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

última edición por tercoIDE el Jueves, 23 Abril 2020, 16:42; editado 1 vez
Perfil MP  
Objetivo: 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

Objetivo: 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".

última edición por vuott el Jueves, 23 Abril 2020, 19:57; editado 3 veces
Perfil MP  
Objetivo: 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?

última edición por vuott el Jueves, 23 Abril 2020, 19:44; editado 1 vez
Perfil MP  
Objetivo: 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.

Perfil MP  
Objetivo: 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

Perfil MP  
Objetivo: 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

Perfil MP  
Objetivo: 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.

Perfil MP  
Objetivo: 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.

Perfil MP  
Objetivo: 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

última edición por vuott el Viernes, 24 Abril 2020, 05:35; editado 3 veces
Perfil MP  
Ir a la página 1, 2  Siguiente

Página 1 de 2


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.3355s (PHP: -46% SQL: 146%)
Consultas SQL: 49 - Debug off - GZIP Activado