在Delphi中传递self作为参数

时间:2013-04-24 10:58:38

标签: delphi pascal

我想将“self”作为参数传递给另一个类的方法(在不同的单元中)。但是第一个类的类型在第二个类中是未知的,因为我不能将第一个单元放入第二个单元的使用部分。所以我将参数类型定义为指针,但是当我尝试从第一个类调用一个方法时,Delphi 7解析器告诉我classtyp是必需的。

那我该如何解决这个问题?

2 个答案:

答案 0 :(得分:6)

通过在实现部分中使用类,您可以转换给定的引用。

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.

答案 1 :(得分:4)

我喜欢这类问题的界面方法。除非你的单元紧密耦合,在这种情况下它们应该共享一个单元,接口是交换类的相关部分的整洁方式,而不必完全了解每种类型。

考虑一下:

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.