FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Saber si un método tiene implementación
Buenas, a ver si alguien me puede orientar un poco: tengo una clase base donde existe un método virtual. De esa clase base desciende una clase que no implementa el método antes mencionado.
Lo que quiero hacer es un procedimiento al cual se le pasa un objeto, de uno de los tipos comentados. El procedimiento debe ejecutar el método pero antes debe averiguar si para ese objeto el método está implementado o no. Mi pregunta es si se puede saber en tiempo de ejecución si para un objeto dado, un método que ha heredado lo ha vuelto a implementar o usa la implementacion de su ancestro. Gracias de antemano Un saludo |
#2
|
|||
|
|||
date una vuelta por este hilo.
Se me ocurre que así podrías comparar los punteros del método... eso sí: tendrías que saber el índice correspondiente. De todos modos, me parece que NO va a ser posible saber a ciencia cierta si el nuevo método implementado llama o no al método del ancestro mediante "Inherited"... |
#3
|
||||
|
||||
No se si utilizando RTTI se podría llegar al método.
Busca ayuda sobre MethodAdress y a partir de ahí a ver si accedes a la dirección y si te devuelve algo correcto.
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#4
|
||||
|
||||
¡Hola!
El caso es interesante, porque puede resolverse con algo parecido al código que escribí en el hilo referido por Poyo. Pero ¿estamos hablando de una clase y un método cuyos nombres se conocen de antemano, o es algo más genérico? Saludos. Al González. |
#5
|
|||
|
|||
El método se conoce, lo que no se conoce a priori es si el objeto descendiente de la clase base reimplementa el método o sigue usando el de la clase base. La cuestion es que en un punto del programa me gustaria saber si el objeto que estoy tratando tiene reimplementado el metodo que hereda de su ancestro o por el contrario usa el del ancestro, ya que en función de una cosa u otra se ejecuta un codigo distinto.
Saludos |
#6
|
||||
|
||||
Hola gushynet,
¿No podrías ampliar un poco el porqué de la necesidad? Quizá esa decisión que mencionas pueda plantearse de otra manera más estándar. // Saludos |
#7
|
|||
|
|||
buenas de nuevo. Lo siento si la pregunta no ha sido todo lo clara, pero mi intención era no hacer muy tedioso y largo el texto de la pregunta, pero visto que ha creado expectación (yo pensaba que era una duda trivial) intentaré explicarme un poco mejor.
La situación es la siguiente: Tengo la clase TPadre y la clase THijo. TPadre implementa el método 'accion' que es virtual. THijo usa la implementacion de accion que hay en TPadre. Si dado un objeto del cual solo se que es descendiente de TPadre, como puedo averiguar si dicho objeto tiene reimplementado el metodo de TPadre o por el contrario sigue usando el de TPadre. En definitiva se podria decir que lo que estoy intentanto averiguar es si en la clase THija el metodo accion tiene la clausula override o simplemente no está por estar usando la implementacion de TPadre, pero todo esto en tiempo de ejecucion claro. En el ejemplo esta TPadre--->THijo, pero la jerarquia puede ser todo lo compleja que se quiera. Espero que ahora si me haya explicado (es que soy un incomprendido Si no se entiende entonces si me explayaré todo lo necesario. Saludos, y gracias por las respuestas recibidas y por las que vendrán |
#8
|
|||
|
|||
Antes que nada pedir disculpas a AI Gonzales por haber respondido antes de leer su mensaje.
Con respecto al ultimo codigo expuesto se me ha pasado por la cabeza la siguiente locura-duda: si en la clase base el metodo es virtual y en la clase hija no se reimplementa quiere decir que la clase hija usa el mismo metodo que la clase padre. Ahora bien, la pregunta es, ¿usar el mismo significa que es el mismo método, es decir comparten el mismo metodo en memoria, o por el contrario cada objeto tiene una copia del método en memoria aunque sean el mismo? Esta pregunta surge de otra duda: todo metodo tiene una posicion de inicio en memoria? Si la respuesta es si, se podrian comparar las posiciones de inicio en memoria de los metodos de TPadre y THijo y averiguar asi si son el mismo metodo o no? Gracias por la ayuda prestada Saludos PD: AI Gonzalez, podrías indicarme alguna pagina, hilo, documentacion en definitiva, sobre algunas cosas del codigo de ejemplo que hiciste, concretamente sobre las funciones redefine ya que hay cosas que no he visto y aunque sospecho lo que pueden hacer preferira no dejarme llevar por la intuicion y confiar en alguien que si este familiarizado con el asunto que estamos tratanto. |
#9
|
|||||||
|
|||||||
¡Hola!
Cita:
Pero para profundizar en ello, creo que sería muy útil que nos dieras a conocer al menos un ejemplo real y concreto de esta situación, incluyendo un poco de código (incluso seudo código de cómo lo visualizas ya terminado), algo de la aplicación que estás programando y de cómo fue que te topaste con esta idea. Vaya, me imagino diciéndonos algo como: Cita:
Cita:
Cita:
Cita:
Cita:
Cita:
He creado las funciones Redefine con conocimiento de causa, y el algoritmo que utilizo en RedefineProc2 es totalmente seguro para cualquier método virtual, incluso si éste fuese abstracto. Si tienes dudas sobre lo que hacen algunas partes o sentencias concretas del código que escribí, exprésalas con confianza. Pero reitero la invitación que te hago al principio de este mensaje (exponer el caso que da origen a la necesidad planteada). Un saludo. Al González. Última edición por Al González fecha: 05-02-2009 a las 18:16:14. |
#10
|
|||
|
|||
Cita:
|
#11
|
||||
|
||||
Cita:
Cita:
|
#12
|
||||
|
||||
¡Hola!
Saliéndome un poco del tema y sobre esto que comenté anteriormente: Cita:
http://www.clubdelphi.com/foros/showthread.php?t=63840 Última edición por Al González fecha: 05-03-2009 a las 08:09:16. |
#13
|
|||
|
|||
Bueno, actualicé eso que veníamos hablando en el otro hilo de las VMT y actualicé el RTTIUtils.pas y lo subí al FTP (en Delphi-Win32/Recursos):
http://www.terawiki.clubdelphi.com/a.../RttiUtils.zip Bueno, además de lo que estaba, le agregué una función que salió de esta conversación. Es la siguiente: function IsOverrideMethod(AClass, Ancestor: TClass; MethodIndex: Integer ): boolean; Adentro se chequea que los argumentos sean válidos y luego Itera por la jerarquía de herencias... mmmm..... ahora que lo pienso a lo mejor está de más eso... no sé... bué... ya está, luego veremos. Ejemplo de Uso:
Se escuchan comentarios, sugerencias y derivadas |
#14
|
|||
|
|||
Hola de nuevo. Voy a intentar explicar lo que estoy haciendo.
Me he creado una clase llamada TUniverso. Esta clase es la clase base a partir de la cual heredan todas las posibles clases que necesite para mis aplicaciones. Por otro lado tenemos una jerarquia de contenedores cuya clase base es TContenedor y desciende directamente de TUniverso. TUniverso tiene una serie de operaciones : asignar, duplicar, comparar,EsMayor,... La cuestion es que todos los objetos que haga son descendientes de TUniverso, por lo que tambien se podran usar los métodos antes descritos. La gracia del asunto es que he usado RTTI en TUniverso de forma que no se tenga que implementar en las clases que te hagas las funciones tipicas de comparar dos objetos, asignar un objeto a otro,..... Todo esto funciona para las propiedades publicadas claro. Por otro lado tenemos la jerarquia contenedor. Estos contenedores guardan cosas del tipo TUniverso o descendiente. Esta jerarquia de contenedores tiene contenedores para guardar elementos del mismo tipo, tipos distintos e incluso elementos repetidos. Hay listas,colas,pilas,arboles,tablas hash,.... Tambien he implementado funciones de E/S para escribir y leer objetos desde fichero. En definitiva lo que queria hacer era una jerarquia de contenedores genericos. La unica condicion que se impone es que los objetos deben descender directa o indirectamente de TUniverso. Ahora estoy con las operaciones de E/S. La forma en que escribo el objeto en disco es igual para objetos simples o complejos. Entiendo un objeto complejo como uno que ademas de tener propiedades simples,enteras,caracteres,....tiene propiedades de tipo objeto, como los contenedores que explique antes. Dentro de las operaciones de E/S hay dos métodos abstractos (llamemosre EscribirRegistro y LeerRegistro cuya implementacion se deja para el usuario que crea una clase a partir de TUniverso. Razón de estos métodos: Entiendo que al ahora de guardar un objeto en memoria lo normal es crearse un tipo de registro que albergue las propiedades del objeto que nos interesa guardar. Los métodos del parrafo anterior hacen eso, escribe o lee el registro equivante del objeto en el fichero. Como no todas las clases de TUniverso necesitan implementar las funcionalidades de E/S puede que haya clases derivadas de TUniverso que no implementen LeerRegistro y EscribirRegistro. Existe una funcion llamada AddToFile que añade el objeto actual al fichero. Esta funcion es virtual. En TUniverso se implementa de una manera, la cual sirve para objetos simples. Pero en TContenedor cambia la implementacion al ser el objeto un contenedor. Estoy en un punto en el que estoy insertando unos objetos en un fichero. Este fichero (no lo he dicho) tiene informacion de control para poder localizar los objetos. El problema que tengo es que dentro del procedimiento en un punto debo saber si el objeto que estoy tratando ha cambiado la implementacion de AddToFile o no, ya que la informacion de control que guarde depende de ello. A parte de la solucion que consiga, la verdad es que me gustaria saber si es posible sacar este tipo de informacion de un objeto. Pues ya esta, realmente no es como me hubiera gustado explicarlo, pero espero que ahora el contexto del problema este mas claro PD: de nuevo disculpas por mi mania de responder a los mensajes por el final, ya que se puede dar el caso de que hayan dado una solucion y yo sigo engordando el hilo. Saludos y gracias por la ayuda que me estan brindando. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Saber que aplicacion tiene el foco | Omega | Varios | 3 | 13-07-2008 17:36:01 |
Sobreescribir método Paint y saber coordenadas a refrescar | Lord Delfos | Gráficos | 3 | 05-03-2008 13:48:28 |
saber si un field tiene el foco | salvanano | Conexión con bases de datos | 0 | 08-05-2007 16:22:48 |
Como saber los dias que tiene un mes?? | alfredosg19 | Varios | 3 | 06-03-2005 12:56:12 |
Saber si la Variable tiene letras | cmgenny | Varios | 1 | 11-05-2004 08:00:59 |
|