Ver Mensaje Individual
  #2  
Antiguo 24-11-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
No sé yo si esto te pueda servir. La idea es que dos unidades pueden usarse una a la otra siempre y cuando no sea ambas en la parte de interface. En el ejemplo que te pongo factorizo por una tercera unidad común que ambas llaman desde su parte interface. Esta unidad común contiene interfaces a las clases, pero no implementan nada. Cada unidad Catalogos y Ventanas usan esta unidad común para poder declarar sus propiedades en la parte interface. Pero es en la parte implementation donde cada una llama a la otra para poder construir realmente el objeto que implementa la interfaz.

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

unit Intf;

interface

type
  IVentana = interface;

  ICatalogo = interface
    function GetVentana: IVentana;
  end;

  IVentana = interface
    function GetCatalogo: ICatalogo;
  end;

implementation

end.
-------------------------------------------------------------------------------

// Catalogos.pas

unit Catalogos;

interface

uses
  Intf;

type
  TCatalogo = class(TInterfacedObject, ICatalogo);
  private
    FVentana: IVentana;

  public
    function GetVentana: IVentana;
    constructor Create;
  end;

implementation

uses
  Ventanas;

function TCatalogo.GetVentana: IVentana;
begin
  Result := FVentana;
end;

constructor TCatalogo.Create;
begin
  FVentana := TVentana.Create;
end;

end.
-------------------------------------------------------------------------------

// Ventanas.pas

unit Ventanas;

interface

uses
  Intf;

type
  TVentana = class(TInterfacedObject, IVentana);
  private
    FCatalogo: ICatalogo;

  public
    function GetCatalogo: ICatalogo;
    constructor Create;
  end;

implementation

uses
  Catalogos;

function TVentana.GetCatalogo: ICatalogo;
begin
  Result := FCatalogo;
end;

constructor TVentana.Create;
begin
  FCatalogo := TCatalogo.Create;
end;

end.

Ahora, al margen de esto, pienso que es un poco raro que una clase, TCatalogo se encargue de su propia representación visual. De alguna manera esto la hace dependiente de la parte visual, cosa que no se recomienda. Quizá te convendría factorizar por un tercer objeto que se encargue de crear la ventana y pasarle los datos de un objeto TCatalogo.

// Saludos

Última edición por roman fecha: 24-11-2006 a las 00:58:01.
Responder Con Cita