Class Forward declarations - entre units diferentes
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:
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:´:
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
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
Curtidas 0
Respostas
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 ?
Pode ser esse o defeito ?
GOSTEI 0
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:
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
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
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
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