![]() |
¿Cómo puedo llamar al método heredado de una clase que no es el ancestro directo?
El tema es así, tengo un componente heredado de TStringGrid y necesito llamar al método DrawCell pero de la clase TDrawGrid.
Tengamos en cuenta que la jerarquía es la siguiente Código:
TDrawGrid = class(TCustomGrid) Vale aclarar que solucioné mi problema sin hacer esto, pero es que me quedó la duda :D... Chagracia! |
¡Buen día a todos!
Sarackganda: Conozco una forma de llamar a un método heredado por una clase ancestral, que ha sido escondido por otra clase ancestral más inmediata. Como sucede en este caso, donde el método virtual DrawCell de TDrawGrid es escondido por le método redefinido DrawCell de TStringGrid. La clave para lograrlo es cambiar temporalmente la clase del objeto. Aquí un ejemplo de ello: Código:
... Llamador2 cambia la clase del objeto por T1, para obtener la dirección de memoria del método T1.P1, pero antes de llamarlo restaura la clase del objeto a T3. Durante la llamada a T1.P1 el objeto es de clase T3, por lo que T1.P1 podrá acceder a elementos de T3 (T1.P1 llama al método redefinido T3.P2). En la mayoría de los casos aconsejo utilizar la segunda solución (Llamador2), ya que se mantiene más la integridad del objeto. En este caso, es importante que el tipo de dato auxiliar TMetodo tenga una declaración equivalente al método en cuestión, en cuanto a cantidad, posición y tipo de parámetros, así como tipo de valor devuelto y la convención de llamada. El cambio de clase es bastante fácil, gracias a que ésta se guarda en los primeros cuatro bytes de la instancia del objeto, es decir en Código:
Pointer (Self)^ Espero esto sea de utilidad. Seguimos en contacto. Al González :). |
Holap,
No lo he probado, pero si no se me escapa nada tendría que ser más sencillo que todo eso. ¿No llegaría con hacer un cast de Self a la clase desada? Código:
Procedure T3.P1; O me estoy dejando algo? |
¡Buen día a todos!
Con respecto a: Cita:
De hecho, el ejemplo que propones generaría un error de desbordamiento de pila por recursión infinita, en caso de que T3 también tuviera redefinido el método virtual P1. O en el mejor de los casos, se estaría llamando al método redefinido T2.P1, pero no al método T1.P1 deseado. Esto se debe a que las llamadas a métodos virtuales son enlazadas en tiempo de ejecución, dependiendo de la clase real del objeto (los primeros cuatro bytes del bloque de memoria que ocupa). Por lo que un molde de tipo en tiempo de compilación no tiene efecto al respecto. Espero esto sea de utilidad. Seguimos en contacto. Al González :). |
Muchas gracias, sus respuestas fueron muy interesantes, aunque mi pregunta apuntaba a alguna herramienta propia del lenguage, pero por lo visto, estas son las soluciones.
Chagracia! |
La franja horaria es GMT +2. Ahora son las 05:17:30. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi