Delphi 2009 Enterpriseを使用して、モデルビューでGoFビジターパターンのコードを作成し、コードを2つのユニットに分けました。1つはドメインモデルクラス用、もう1つはビジター用です(ビジターの実装ごとに他のユニットが必要になる可能性があるため、 1ユニット?'大きな泥だんご'先!)。
unit VisitorUnit;
interface
uses
ConcreteElementUnit;
type
IVisitor = interface;
IElement = interface
procedure Accept(AVisitor :IVisitor);
end;
IVisitor = interface
procedure VisitTConcreteElement(AElement :TConcreteElement);
end;
TConcreteVisitor = class(TInterfacedObject, IVisitor)
public
procedure VisitTConcreteElement(AElement :TConcreteElement);
end;
implementation
procedure TConcreteVisitor.VisitTConcreteElement(AElement :TConcreteElement);
begin
{ provide implementation here }
end;
end.
ビジネスモデルクラスの2番目のユニット
unit ConcreteElementUnit;
interface
uses
VisitorUnit;
type
TConcreteElement = class(TInterfacedObject, IElement)
public
procedure Accept(AVisitor :IVisitor); virtual;
end;
Class1 = class(TConcreteElement)
public
procedure Accept(AVisitor :IVisitor);
end;
implementation
{ Class1 }
procedure Class1.Accept(AVisitor: IVisitor);
begin
AVisitor.VisitTConcreteElement(Self);
end;
end.
問題がわかりますか?円形のユニット参照。エレガントな解決策はありますか?CRの問題を回避するために、基本インターフェイス/基本クラス定義を備えた「n + 1」個の追加ユニットと、ハードキャストのようなトリックが必要だと思いますか?