Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-02-2009
poyo poyo is offline
Miembro
 
Registrado: ene 2009
Posts: 47
Poder: 0
poyo Va por buen camino
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"...
Responder Con Cita
  #2  
Antiguo 04-02-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.293
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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.
Responder Con Cita
  #3  
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
Poder: 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!

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.
Responder Con Cita
  #4  
Antiguo 05-02-2009
gushynet gushynet is offline
Miembro
 
Registrado: ago 2008
Posts: 26
Poder: 0
gushynet Va por buen camino
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
Responder Con Cita
  #5  
Antiguo 05-02-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #6  
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
Poder: 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!

Como dice Román, quizá haya una solución más estándar al problema de fondo (esperamos llegar a conocerlo).

Pero esta noche aproveché un espacio de tiempo para realizar algunos experimentos que dieron como resultado el siguiente código. Funciona bien y en esencia soluciona el problema bajo los términos descritos por Gushynet, aunque no sugeriría que lo empleara sin antes conocer más a detalle el caso que originó ese planteamiento.

Digamos que para mí fue más que nada un ejercicio de aprendizaje y al final el gusto por compartir los resultados.

Código Delphi [-]
implementation

{$R *.dfm}

Type
  // Clase base que declara dos métodos virtuales, uno de ellos abstracto
  TA = Class
    Procedure Proc1; Virtual;
    Procedure Proc2; Virtual; Abstract;
  End;

  // Clase hija que redefine los dos métodos virtuales
  TB = Class (TA)
    Procedure Proc1; Override;
    Procedure Proc2; Override;
  End;

  // Clase hija que no redefine ninguno de los métodos virtuales
  TC = Class (TA)
  End;

Procedure TA.Proc1;
Begin
End;

Procedure TB.Proc1;
Begin
End;

Procedure TB.Proc2;
Begin
End;

{ Función para saber si Obj redefine el método Proc1.  Código para métodos
  virtuales NO abstractos. }
Function RedefineProc1 (Const Obj :TA) :Boolean;
Type
  TMetodo = Procedure Of Object;
Var
  Metodo :TMethod;
Begin
  TMetodo (Metodo) := Obj.Proc1;
  Result := Metodo.Code <> @TA.Proc1;
End;

{ Función para saber si Obj redefine el método Proc2.  Código para métodos
  virtuales abstractos y no abstractos. }
Function RedefineProc2 (Const Obj :TA) :Boolean;
Type
  TMetodo = Procedure Of Object;
Var
  Metodo :TMethod;
  EntradaVMT :Pointer;
Begin
  EntradaVMT := TA;

  Asm
    { De la VMT de TA, obtenemos la entrada que guarda la dirección del
      método Proc2 (cuando el método es abstracto, esa entrada contiene la
      dirección de memoria del procedimiento _AbstractError) }
    Add EntradaVMT, VMTOffset TA.Proc2
  End;

  TMetodo (Metodo) := Obj.Proc2;
  Result := Metodo.Code <> Pointer (EntradaVMT^);
End;

procedure TForm1.Button1Click(Sender: TObject);
Var
  A, B, C :TA;
begin
  { TEMA: Cómo saber si la clase de un objeto redefine un método virtual. }

  A := TA.Create;
  B := TB.Create;
  C := TC.Create;

  // Pruebas con Proc1

  If RedefineProc1 (A) Then
    ShowMessage ('A sí redefine Proc1')
  Else
    ShowMessage ('A no redefine Proc1');

  If RedefineProc1 (B) Then
    ShowMessage ('B sí redefine Proc1')
  Else
    ShowMessage ('B no redefine Proc1');

  If RedefineProc1 (C) Then
    ShowMessage ('C sí redefine Proc1')
  Else
    ShowMessage ('C no redefine Proc1');

  // Pruebas con Proc2

  If RedefineProc2 (A) Then
    ShowMessage ('A sí redefine Proc2')
  Else
    ShowMessage ('A no redefine Proc2');

  If RedefineProc2 (B) Then
    ShowMessage ('B sí redefine Proc2')
  Else
    ShowMessage ('B no redefine Proc2');

  If RedefineProc2 (C) Then
    ShowMessage ('C sí redefine Proc2')
  Else
    ShowMessage ('C no redefine Proc2');

  A.Free;
  B.Free;
  C.Free;
end;

Anexo el programa de ejemplo.

Un abrazo virtual.

Al González.
Archivos Adjuntos
Tipo de Archivo: zip VMTSaberRedefine.zip (4,2 KB, 3 visitas)
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

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


La franja horaria es GMT +2. Ahora son las 01:00:55.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi