Ver Mensaje Individual
  #10  
Antiguo 05-02-2009
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Reputación: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
¡Hola!

Cita:
Empezado por gushynet Ver Mensaje
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.
Gracias por explicarlo con mayor detenimiento, Gushynet. Pero me parece que es lo mismo que ya dábamos por entendido Román y yo. Nuestra inquietud por pedirte más información de contexto surge de la sospecha de que detrás de todo esto hay otra necesidad o motivación, es decir, que el origen concreto del planteamiento podría atacarse de otra manera.

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:
Ah, pues mira, la clase en cuestión es TWinControl y el método en cuestión es AdjustClientRect, el cual es redefinido sólo por unas cuantas clases derivadas, como TCustomPanel y TScrollingWinControl, pero no así por la gran mayoría de descendientes (TButton, TEdit, etc). Entonces tengo un proceso que cuando el usuario se posiciona en un control (sea botón, edit, etc.) quiero que se valide que...y para ello le envío este objeto como parámetro a esta función [código de la función] para que haga esto, pero valide aquello, porque de esta forma me aseguro de que cuando..., etc., etc.
O bien:
Cita:
Estoy creando una jerarquía de clases, de la siguiente manera. Tengo el método virtual X que sirve para...y entonces lo redefino aquí y allá, de tal manera que haga esto otro...pero al hacer este proceso requiero validar si el método está redefinido, ya que cuando no lo está, el programa podrá realizar tal cosa, pero si estuviera redefinido me causa este problema..., el cual podría solucionarse si primero verifico si hay redefinición o no, y con eso podría poner este If para que el código de mi rutina quede así...



Cita:
Empezado por gushynet Ver Mensaje
Antes que nada pedir disculpas a AI Gonzales por haber respondido antes de leer su mensaje.
No te preocupes, ya estoy ligeramente acostumbrado a eso, y también a que confundan mi nombre (Al-berto González).

Cita:
Empezado por gushynet Ver 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?
Es el mismo método compartido (no se crean copias).

Cita:
Empezado por gushynet Ver Mensaje
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?
En efecto, eso mismo es lo que hago en las funciones RedefineProc1 y RedefineProc2 que puse anteriormente.
Código Delphi [-]
  { Devuelve True si el método Obj.Proc1 tiene una dirección 
    de memoria  diferente que el método TA.Proc1 }
  TMetodo (Metodo) := Obj.Proc1;
  Result := Metodo.Code <> @TA.Proc1;
Código Delphi [-]
  { Devuelve True si el método Obj.Proc2 tiene una dirección de memoria
    diferente que la indicada por la VMT de la clase TA }
  TMetodo (Metodo) := Obj.Proc2;
  Result := Metodo.Code <> Pointer (EntradaVMT^);


Cita:
Empezado por gushynet Ver Mensaje
PD: Al 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.
La primera fuente de información que recomiendo es la propia ayuda de Delphi, donde hay algunos temas que hablan de la VMT y del operador VMTOffset. Y el hilo que te recomendó Poyo más arriba trata sobre esos mismos temas. Igualmente está la opción de búsqueda de este estupendo foro, así como el propio Google.

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.
Responder Con Cita