Class Forward declarations - entre units diferentes

Delphi

25/09/2007

Pessoal, se já tiver respondido me desculpem, mas pelas palavras triviais não consegui localizar.

Seguinte, tenho duas classes que se usam mutuamente e estão declaradas da seguinte forma:

type
  TClassB = class;
  TClassA = class(X)
    property ClassB....
  end;

  TClassB = class(Y)
    procedure Bozo(A: TClassA);
  end;


Meu problema é que as duas classes são bem grandes, e tem outras classes envolvidas por herança e composição. Então eu gostaria de separar em duas units... o problema é que se eu separar simplesmente ´assim:´:

unit A;

uses B;

type   TClassA = class(X)
    property ClassB....
  end;

.
.
.

unit B;

uses A;

  IClassB = interface
    procedure Bozo(A: TClassA);
  end;


Porem, neste caso eu tenho problema com referencia circular...

Alguem sabe me dizer se existe algum ´truque´ que permita a separação das units dessa forma. Atenção para a IClassB ser uma interface, na verdade tudo o que preciso é passar a classe A por parametro para Bozo ;) e a classe A ´TEM UMA´ classe que implementa IClassB.

[]´s


Paulo Samurai

Paulo Samurai

Curtidas 0

Respostas

Nerdex

Nerdex

25/09/2007

E a implementação de TClassB juntamente com seu devido property, por definição ficariam na Unit B, mas ela sumiu ... ?
Pode ser esse o defeito ?


GOSTEI 0
Paulo Samurai

Paulo Samurai

25/09/2007

Não, não pode ;) nada sumiu,

Eu troquei de classe para interface pois é mais proximo do meu problema real... na verdade hoje está funcionando da seguinte forma:

unit A;

uses .....;

type
  TClasse = class;  

  IAdaptador = interface
    procedure Adapta(AClasse: TClasse);
  end;

  TClasse = class
  public
    property Adaptador: IAdaptador..
  end;


unit B;

uses A;

type
  TAdaptadorBase = class(TInterfacedPersistent, IAdaptador)
  public 
    procedure Adapta(AClasse: TClasse);
  end;


Na verdade a questão não é ´funcionamento´, pq está funcionando tudo certinho, mas está ´bagunçado´ pois a interface dos adaptadores que não é pequena, ficou junto da unit que tem algumas classes de negócio que uso, que tampouco é pequena.... eu só gostaria mandar os códigos relacionados a adaptadores para outra(s) unit(s) sem referencia circular ;)

[]´s


GOSTEI 0
Paulo Samurai

Paulo Samurai

25/09/2007

Pessoal,

Rachei os cascos aqui e consegui uma solução, eu acho, pois ainda não testei. Na verdade é muito trivial e acabou sendo um pouco 6 por meia duzia, mas consegue separar em units diferentes.

Criarei uma interface IClasse e a minha TClasse implementará essa interface. Basta depois trocar o método Adapta(AClasse: TClasse) por Adapta(AClasse: IClasse).

Eu não tinha necessidade dessa interface, mas ela provavelmente servirá para separar as units como deseja, agora terei uma unit com as duas interfaces (IClasse e IAdaptador). Basta saber se funciona ´forward declaration´ para interfaces, mas me parece que compila.

Obrigado a todos que leram, tenham conseguido ou não ajudar.

[]´s


GOSTEI 0
POSTAR