Portal    Foro    Buscar    FAQ    Registrarse    Conectarse

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

Clases: Como Clonar Un Object De Una Clase Que No Conocemos?
Artículo
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




 
última edición por tercoIDE el Jueves, 23 Abril 2020, 16:42; editado 1 vez 
tercoIDE - Ver perfil del usuario Enviar mensaje privado  
tercoIDE [ Jueves, 23 Abril 2020, 16:42 ]
 


Clases: Como Clonar Un Object De Una Clase Que No Conocemos?
Comentarios
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



 
jsbsan - Ver perfil del usuario Enviar mensaje privado  
jsbsan [ Jueves, 23 Abril 2020, 19:16 ]
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 usuario Enviar mensaje privado  
vuott [ Jueves, 23 Abril 2020, 19:31 ]
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 usuario Enviar mensaje privado  
vuott [ Jueves, 23 Abril 2020, 19:42 ]
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.



 
tercoIDE - Ver perfil del usuario Enviar mensaje privado  
tercoIDE [ Jueves, 23 Abril 2020, 20:29 ]
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



 
tercoIDE - Ver perfil del usuario Enviar mensaje privado  
tercoIDE [ Jueves, 23 Abril 2020, 20:33 ]
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




 
tercoIDE - Ver perfil del usuario Enviar mensaje privado  
tercoIDE [ Jueves, 23 Abril 2020, 21:22 ]
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 usuario Enviar mensaje privado  
tincho [ Jueves, 23 Abril 2020, 22:31 ]
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 usuario Enviar mensaje privado  
tincho [ Jueves, 23 Abril 2020, 22:35 ]
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 usuario Enviar mensaje privado  
vuott [ Jueves, 23 Abril 2020, 23:07 ]
Mostrar mensajes anteriores:    
 
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 3 invitados
Usuarios registrados conectados: Ninguno


 



 

cron