我想将“self”作为参数传递给另一个类的方法(在不同的单元中)。然而,第一类的类型在第二类中是未知的,因为我不能将第一类放入第二类的使用部分。所以我将参数类型定义为指针,但是当我尝试从第一个类调用方法时,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.