「self」をパラメーターとして別のクラスのメソッド(別のユニット内)に渡したいと思います。ただし、最初のユニットを 2 番目のユニットの uses セクションに入れることができないため、最初のクラスのタイプは 2 番目のクラスでは不明です。そのため、パラメータの型をポインタとして定義しますが、最初のクラスからメソッドを呼び出そうとすると、Delphi 7 パーサーから classtyp が必要であると通知されます。
では、この問題をどのように解決すればよいでしょうか。
実装部分でクラスを認識させることで、指定された参照をキャストできます。
unit UnitY;
interface
uses Classes;
type
TTest=Class
Constructor Create(AUnKnowOne:TObject);
End;
implementation
uses UnitX;
{ TTest }
constructor TTest.Create(AUnKnowOne: TObject);
begin
if AUnKnowOne is TClassFromUnitX then
begin
TClassFromUnitX(AUnKnowOne).DoSomeThing;
end
else
begin
// ....
end;
end;
end.
このタイプの問題に対するインターフェースアプローチが好きです。ユニットが非常に緊密に結合されていない限り (ユニットを共有する必要がある場合)、インターフェースは、各タイプの完全な知識がなくてもクラスの関連部分を交換するための整然とした方法です。
検討 :
unit UnitI;
interface
type
IDoSomething = Interface(IInterface)
function GetIsFoo : Boolean;
property isFoo : Boolean read GetIsFoo;
end;
implementation
end.
と
unit UnitA;
interface
uses UnitI;
type
TClassA = class(TInterfacedObject, IDoSomething)
private
Ffoo : boolean;
function GetIsFoo() : boolean;
public
property isFoo : boolean read GetIsFoo;
procedure DoBar;
constructor Create;
end;
implementation
uses UnitB;
constructor TClassA.Create;
begin
Ffoo := true;
end;
function TClassA.GetIsFoo() : boolean;
begin
result := Ffoo;
end;
procedure TClassA.DoBar;
var SomeClassB : TClassB;
begin
SomeClassB := TClassB.Create;
SomeClassB.DoIfFoo(self);
end;
end.
TClassB
は、それを含むユニットについて何も知る必要がないことに注意してください。インターフェイス コントラクトTClassA
に従うすべてのオブジェクトを受け入れるだけです。IDoSomething
unit UnitB;
interface
uses UnitI;
type
TClassB = class(TObject)
private
Ffoobar : integer;
public
procedure DoIfFoo(bar : IDoSomething);
constructor Create;
end;
implementation
constructor TClassB.Create;
begin
Ffoobar := 3;
end;
procedure TClassB.DoIfFoo(bar : IDoSomething);
begin
if bar.isFoo then Ffoobar := 777;
end;
end.