Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 2
Ir a la página 1, 2  Siguiente
 
Clases: Como Clonar Un Object De Una Clase Que No Conocemos?
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje 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

 




===================
"Los IF son mas rápidos" - autor anónimo
 
última edición por tercoIDE el Jueves, 23 Abril 2020, 16:42; editado 1 vez 
tercoIDE - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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.
 




===================
"Los IF son mas rápidos" - autor anónimo
 
tercoIDE - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 




===================
"Los IF son mas rápidos" - autor anónimo
 
tercoIDE - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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

 




===================
"Los IF son mas rápidos" - autor anónimo
 
tercoIDE - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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.
 



 
tincho - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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.
 



 
tincho - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
Public Const VAR As Integer = 100


Public Function Adde(i As Integer) As Integer
  
  Return i + VAR
  
End


Public Function Subtrahe(i As Integer) As Integer
  
  Return i - VAR
  
End

 



 
última edición por vuott el Viernes, 24 Abril 2020, 05:35; editado 3 veces 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Clonar Controles shordi Controles/Librerías/Componentes 7 Lunes, 13 Diciembre 2010, 11:42 Ver último mensaje
shordi
No hay nuevos mensajes Acceder A Objetos Que Están Dentro De Un ... santijav General 1 Viernes, 29 Abril 2011, 22:46 Ver último mensaje
santijav
No hay nuevos mensajes Como Esquematizar Clases? v3ctor General 20 Jueves, 01 Octobre 2015, 19:36 Ver último mensaje
Shell
No hay nuevos mensajes Mismo Result Como Parametro De Varias Clases gambafeliz General 13 Jueves, 29 Agosto 2019, 18:59 Ver último mensaje
gambafeliz
 

Publicar nuevo tema  Responder al tema  Página 1 de 2
Ir a la página 1, 2  Siguiente

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 2 invitados
Usuarios registrados conectados: Ninguno


 
Lista de permisos
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



  

 

cron