Ozanが言ったように:ほとんどの場合、良い答えは仮想メソッドで基本クラスを作成することです:
unit BaseWorld;
TBaseWorld = class
function GetWorldInfo() : TWorldInfo; virtual; {abstract;}
...
unit Player;
TPlayer = class
FWorld : TBaseWorld;
constructor Create( AWorld : TBaseWorld );
...
unit RealWorld;
TWorld = class(TBaseWorld)
function GetWorldInfo() : TWorldInfo; override;
...
TWorld.AddPlayer();
begin
TPlayer.Create(Self);
end;
...
または、同様の効果で、インターフェイスを公開します。
unit WorldIntf;
IWorldInterface = interface
function GetWorldInfo() : TWorldInfo;
...
unit Player;
TPlayer = class
FWorld : IWorldInterface;
constructor Create( AWorld : IWorldInterface );
...
unit RealWorld;
TWorld = class(TInterfacedObject, IWorldInterface)
function GetWorldInfo() : TWorldInfo;
...
TWorld.AddPlayer();
begin
TPlayer.Create(Self);
end;
...
コードの動作に応じて、抽象レイヤー(上記の例のように)またはプレーヤー(Ozanによって提案されたように)の背後にワールドを非表示にすることができます。