3

質問:循環参照を避けながら、2つのクラスを独自のファイルに分割したいと思います。

私はいくつかのクラス(およびいくつかの列挙と定数)を持つユニットを持っています。誰もがタペット兄弟のクリックアンドクラックを認識します:

unit Cartalk;

interface

type
   TSolution = (solTransmission, solBrakes, solGremlins);

   TTappetBrother = class(TObject)
   public
      function GetSolution: TSolution; virtual; abstract;
   end;

   TClick = class(TTappetBrother)
   public      
      function GetSolution: TSolution; override;
   end;

   TClack = class(TTapperBrother)
   public
      function GetSolution: TSolution; override;
   end;

implementation

function TClick.GetSolution: TSolution;
begin
   Result := solTransmission;
end;

function TClack.GetSoltution: TSolution;
begin
   Result := solGremlins;
end;

end.

今は明らかに私の2つのクラスTClickでありTClick、非常に複雑です。管理しやすくするために、既存の外部コードを壊さずに、独自のユニットに分割TClickして分割したいと思います。TClack

それで私の最初の亀裂は次のようになります:

unit Cartalk;

interface

uses
   Cartalk_Click, Cartalk_Clack;

type
   TSolution = (solTransmission, solBrakes, solGremlins);

   TTappetBrother = class(TObject)
   public
      function GetSolution: TSolution; virtual; abstract;
   end;

   TClick = Cartalk_Click.TClick; //alias brought in from Cartalk_Click.pas

   TClack = Cartalk_Clack.TClack; //alias brought in from Cartalk_Clack.pas

 implementation

 end.

完璧です、私はで利用可能なすべての同じクラスを持っていますCartalk.pas、今私はただ書く必要がCartalk_Click.pasありCartalk_Clack.pasます:

unit Cartalk_Click;

interface

type
   TClick = class(TTappetBrother)
   public      
      function GetSolution: TSolution; override;
   end;

implementation

function TClick.GetSolution: TSolution;
begin
   Result := solTransmission;
end;

end.

もちろん、問題はそれでTTappetBrotherありTSolution、このユニットでは宣言されていません。そこで、彼らが住んでいる場所への参照を追加し、usesそれが失敗するのを見て、私の質問の中心に到達します:

unit Cartalk_Click;

interface

uses
   Cartalk;

type
   TClick = class(TTappetBrother)
   public      
      function GetSolution: TSolution; override;
   end;

implementation

function TClick.GetSolution: TSolution;
begin
   Result := solTransmission;
end;

end.

との間に循環参照がCartalkありCartalk_Clickます。

注:もちろん、私はCartalkユニットを持っていません。クリックして、タッパー兄弟をクラックします。これは単なる例です。実際には、ユニットに3つのクラス、20の列挙、および293の定数があります。

4

1 に答える 1

5

ユニットを書く:

unit Tappet;

interface

type
   TSolution = (solTransmission, solBrakes, solGremlins);

   TTappetBrother = class(TObject)
   public
      function GetSolution: TSolution; virtual; abstract;
   end;

implementation

end.

Clickとユニットで使用しClackます。次に、CarTalk3つすべてを使用するようにユニットを作成し、そのインターフェイスで必要なタイプをエクスポートします。循環参照は必要ありません。

于 2010-10-21T20:55:37.360 に答える