operador de asignación genérico
Hola, tengo unas dudillas a ver si alguien me puede orientar un poco.
Cuando se realiza la siguiente asignacion en delphi:
objeto1 := objeto2;
realmente no se hace la asignacion sino que objeto1 apuntara a la misma posicion de memoria que objeto2.
Estoy intentando hacer un procedimiento que realice la asignacion completa, es decir, el procedimiento debe crear una nueva instancia del objeto pasado por parametro (objeto2), que en principio no sabemos de que tipo es, y copiar el contenido de todas las propiedades del objeto2 en las propiedades del objeto1.
procedimiento TObjeto.Asignar(obj: pointer );
En este punto se me han planteado una serie de dudas sobre la solucion que se me ha ocurrido pero que no he conseguido implementar.
Primero, el tipo del parametro que le paso al metodo es de tipo pointer ya que delphi y si no me equivoco la variable objeto no tiene el objeto en si sino la direccion del mismo, por lo que si el parametro es de tipo pointer, el método aceptara cualquier tipo de objeto ya que como dije todo objeto en delphi es un puntero al objeto. No se si este razonamiento es válido y eficiente pero compilar compila.
Una vez entramos en el metodo los pasos que creo se deberia seguir para realizar la asignacion son los siguientes:
1. Averigua el tipo del objeto pasado por parametro
aqui se que puedo usar propiedades como ClassName o ClassType pero aunque he conseguido acceder a ClassName no he conseguido siquiera cambiar el valor de una propiedad porque siempre se produce el mismo error en tiempo de ejecucion, error en el acceso a memoria.
2. crea una nueva instancia del objeto una vez averiguado su tipo
3. accedemos a todos los campos del objeto pasado por parametro y copiamos su contenido en las propiedades del objeto creado.
4. Devolvemos el objeto creado.
Las dudas que tengo son muchas pero ahi van unas cuantas:
- la unica manera de averiguar el tipo del objeto que me han pasado es asignando el pointer a un objeto local de tipo TObject y accediento a la propiedad NameClasses o haciendo una conversion directa:
NombreClase := PTObject(Objeto)^.ClassName;
PTObject es un puntero a TObject.
- ¿como creo una nueva instancia? lo he conseguido hacer si dentro del metodo realizo una conversion (al parametro)al tipo que sé que le estoy pasando al metodo pero la gracia esta en que ese metodo lo pueda usar cualquier independientemente del objeto para el que lo vaya a usar.
- Sabeis de documentacion(en español mejor) sobre la Programacion orientada a objetos en object pascal sin ser el manual de delphi.
Gracias de antemano por vuestra ayuda.
Un saludo.
PD:disculpas por lo extenso que me ha quedado el mensaje.
Cuando se realiza la siguiente asignacion en delphi:
objeto1 := objeto2;
realmente no se hace la asignacion sino que objeto1 apuntara a la misma posicion de memoria que objeto2.
Estoy intentando hacer un procedimiento que realice la asignacion completa, es decir, el procedimiento debe crear una nueva instancia del objeto pasado por parametro (objeto2), que en principio no sabemos de que tipo es, y copiar el contenido de todas las propiedades del objeto2 en las propiedades del objeto1.
procedimiento TObjeto.Asignar(obj: pointer );
En este punto se me han planteado una serie de dudas sobre la solucion que se me ha ocurrido pero que no he conseguido implementar.
Primero, el tipo del parametro que le paso al metodo es de tipo pointer ya que delphi y si no me equivoco la variable objeto no tiene el objeto en si sino la direccion del mismo, por lo que si el parametro es de tipo pointer, el método aceptara cualquier tipo de objeto ya que como dije todo objeto en delphi es un puntero al objeto. No se si este razonamiento es válido y eficiente pero compilar compila.
Una vez entramos en el metodo los pasos que creo se deberia seguir para realizar la asignacion son los siguientes:
1. Averigua el tipo del objeto pasado por parametro
aqui se que puedo usar propiedades como ClassName o ClassType pero aunque he conseguido acceder a ClassName no he conseguido siquiera cambiar el valor de una propiedad porque siempre se produce el mismo error en tiempo de ejecucion, error en el acceso a memoria.
2. crea una nueva instancia del objeto una vez averiguado su tipo
3. accedemos a todos los campos del objeto pasado por parametro y copiamos su contenido en las propiedades del objeto creado.
4. Devolvemos el objeto creado.
Las dudas que tengo son muchas pero ahi van unas cuantas:
- la unica manera de averiguar el tipo del objeto que me han pasado es asignando el pointer a un objeto local de tipo TObject y accediento a la propiedad NameClasses o haciendo una conversion directa:
NombreClase := PTObject(Objeto)^.ClassName;
PTObject es un puntero a TObject.
- ¿como creo una nueva instancia? lo he conseguido hacer si dentro del metodo realizo una conversion (al parametro)al tipo que sé que le estoy pasando al metodo pero la gracia esta en que ese metodo lo pueda usar cualquier independientemente del objeto para el que lo vaya a usar.
- Sabeis de documentacion(en español mejor) sobre la Programacion orientada a objetos en object pascal sin ser el manual de delphi.
Gracias de antemano por vuestra ayuda.
Un saludo.
PD:disculpas por lo extenso que me ha quedado el mensaje.