Ver Mensaje Individual
  #1  
Antiguo 11-07-2006
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Reputación: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Llamar a método virtual de un objeto pasado como parámetro

He estado buscando en el foro y en Internet pero no he encontrado nada.

Tengo un programa que, simplificando mucho, es el siguiente. (No creo que a nadie le cueste seguirlo)

Código Delphi [-]
PROGRAM base;

TYPE
  CLASE_BASE = CLASS
  PUBLIC
    PROCEDURE Metodo; VIRTUAL;
  END;

  CLASE_HIJA = CLASS (CLASE_BASE)
  PUBLIC
    PROCEDURE Metodo; OVERRIDE;
  END;

  PROCEDURE CLASE_BASE.Metodo;
  BEGIN
    WriteLn ('Llamó a CLASE_BASE');
  END;

  PROCEDURE CLASE_HIJA.Metodo;
  BEGIN
    WriteLn ('Llamó a CLASE_HIJA');
  END;

(* Aquí está el problema.  Es un procedimiento que se va a usar como
   "callback", de ahí que reciba un POINTER. *)
PROCEDURE Procedimiento (Objeto: POINTER);
BEGIN
  WITH CLASE_BASE (Objeto) DO
    Metodo;
END;

VAR
  Objeto: CLASE_BASE;
BEGIN
(* Aquí ponemos en marcha todo. *)
  Objeto := CLASE_HIJA.Create;
{ Simulamos una llamada "callback" }
  Procedimiento ( POINTER (Objeto));
  Objeto.Free;
END.

Como dice el comentario, voy a utilizar un procedimiento como "callback", es decir, que voy a pasar la dirección de dicho procedimiento a una librería ya escrita para que lo llame cuando sea necesario (parecido a la función de procesamiento de mensajes de ventana en Windows).

El problema es que cuando se llama al Procedimiento siempre llama al método de la CLASE_BASE y nunca al de la CLASE_HIJA. ¿Por qué me sucede esto? ¿Cómo puedo hacer que llame al método apropiado?

Última edición por dec fecha: 11-07-2006 a las 16:17:09.
Responder Con Cita