Thursday, 13 November 2008

Evitar referencias circulares entre clases en varias unidades (Delphi)

En el ejemplo anterior de la referencia circular en una misma unidad. Si decidimos separarlos en 2 unidades diferentes, tendremos el mismo problema. Al hacer referencia de cada unidad en su uses, nos encontraremos con un error de compilación.




unit Unit1;

interface

uses Unit2;

type
TClassA = class(TObject)
public
objClassB: TClassB;
end;

implementation

end.




unit Unit2;

interface

uses Unit1;

type
TClassB = class(TObject)
public
objClassA: TClassA;
end;

implementation

end.

Para solucionar este problema, utilizaremos una Interface entre las 2 clases que la pondremos en una tercera unidad:

Ahora tendriamos:

unit Unit3;

interface

type
IClassB = interface
['{9816C2EC-C816-44EF-A6B4-C7B25BADE494}']
end;

implementation

end.

unit Unit1;

interface

uses Unit3;

type
TClassA = class(TObject)
public
objClassB: IClassB;
end;

implementation

end.




unit Unit2;

interface

uses Unit1, Unit3;

type
TClassB = class(TInterfacedObject, IClassB)
public
objClassA: TClassA;
end;

implementation

end.

0 comments:

Post a Comment