Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Dudas con patrón visitante (https://www.clubdelphi.com/foros/showthread.php?t=62716)

mscblazer 09-01-2009 19:34:46

Dudas con patrón visitante
 
Cuando programo usando el patrón visitante la aplicación me genera un error de referencia cíclica, puesto que tengo 2 units cuyas clases se referencian mutuamente.

¿Cómo puedo corregir este problema en Delphi?

Gracias adelantadas.
:confused:

roman 09-01-2009 19:42:06

En Delphi dos unidades no pueden referenciarse mutuamente desde su sección interface, pero sí desde su sección implementation.

// Saludos

mscblazer 09-01-2009 19:54:08

Ante todo gracias por tu rápida respuesta, pero cuando programas usando el patrón visita necesitas incluir las units en la interfaz.

Por ejemplo en C++ tampoco puedes hacerlo porque se crearía una refrencia cíclica también, pero existe un recurso.

Un fichero tu lo incluyes así.
#include "NombreFichero"
Pero para evitar la referencia cíclica usarías

class NombreFichero
Esto es como si hicieras un forward con las clases.

Supongo que en Delphi debe haber un recurso parecido para lograrlo.

Gracias.

roman 09-01-2009 20:07:17

En Delphi, como dices, hay un recurso similar usando la directiva {$I archivo.inc}, pero, realmente no tendrás dos unidades distintas, simplemente estás incluyendo un archivo en otro, de forma que es como si el contenido del archivo externo lo hubieras escrito en el punto donde está la directiva.

Por otro lado, este problema puede resolverse definiendo clases abstractas en una unidad:

Código Delphi [-]
// patronvisitante.pas

type
  TVisitante = class;

  TElemento = class
    procedure Aceptar(Visitante: TVisitante); virtual; abstract;
  end;

  TVisitante = class
    procedure Visitar(Elemento: TElemento); virtual; abstract;
  end;

En esta unidad no implementas nada, pero ya puedes incluirla en las unidades de las clases descendientes:

Código Delphi [-]
unit UnElemento;

interface

uses patronvisitante;

type
  TUnElemento = class(TElemento)
    procedure Aceptar(Visitante: TVisitante); override;
  end;

implementation

procedure TUnVisitante.Aceptar(Visitante: TVisitante);
begin
  ...
end;

end.

Código Delphi [-]
unit UnVisitante;

interface

uses patronvisitante;

type
  TUnVisitante = class(TVisitante)
    procedure Visitar(Elemento: TElemento); override;
  end;

implementation

procedure Visitar(Elemento: TElemento);
begin
  ...
end;

end.

// Saludos

cHackAll 09-01-2009 20:08:32

Puedes implementar el Visitor Pattern en una misma unidad sin usar una clase en cada "libreria", ahora no es lo mismo un "uses" de Delphi a un "include" de C; que a proposito en Delphi seria algo como {$i archivo.ext}.

mscblazer 09-01-2009 20:34:23

Muchas gracias a todos por la valiosa ayuda. particularmente a Roman
Pude resolver sin problemas

Gracias


La franja horaria es GMT +2. Ahora son las 14:12:38.

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