想象一下以下两类国际象棋游戏:
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中,这两个变量都将对它们可用。