想象一下以下两类国际象棋游戏:

TChessBoard = class
private
  FBoard : array [1..8, 1..8] of TChessPiece;
...
end;

TChessPiece = class abstract
public
   procedure GetMoveTargets (BoardPos : TPoint; Board : TChessBoard; MoveTargetList : TList <TPoint>);
...
end;


我希望在两个单独的单元ChessBoard.pas和ChessPiece.pas中定义这两个类。

如何避免在这里遇到循环单位引用(另一个单位的接口部分需要每个单位)?

最佳答案

将定义TChessPiece的单位更改为如下所示:

TYPE
  tBaseChessBoard = class;

  TChessPiece = class
    procedure GetMoveTargets (BoardPos : TPoint; Board : TBaseChessBoard; ...
  ...
  end;


然后将定义TChessBoard的单元修改为如下所示:

USES
  unit_containing_tBaseChessboard;

TYPE
  TChessBoard = class(tBaseChessBoard)
  private
    FBoard : array [1..8, 1..8] of TChessPiece;
  ...
  end;


这使您可以将具体实例传递给棋子,而不必担心循环引用。由于董事会是在私下使用Tchesspieces的,因此在Tchesspiece声明之前,它实际上不必存在,只是占位符。当然,tChessPiece必须知道的任何状态变量都应该放置在tBaseChessBoard中,这两个变量都将对它们可用。

07-25 23:40