Delphi 检查类名

Delphi 检查类名,delphi,class,Delphi,Class,我不知道所有者对象的类名。所以我必须检查我的代码中的每一个地方,比如: if TObject(OWNER) is TFirstClass then begin TFirstClass(OWNER).FirstFunction; TFirstClass(OWNER).SecondFunction; ... end else if TObject(OWNER) is TSecondClass then begin TSecondClass(OWNER).FirstFunction;

我不知道所有者对象的类名。所以我必须检查我的代码中的每一个地方,比如:

if TObject(OWNER) is TFirstClass then begin
  TFirstClass(OWNER).FirstFunction;
  TFirstClass(OWNER).SecondFunction;
  ...
end else
if TObject(OWNER) is TSecondClass then begin
  TSecondClass(OWNER).FirstFunction;
  TSecondClass(OWNER).SecondFunction;
  ...
end;
有更好的办法吗?因为我必须这样做,如果条件在许多地方的代码。 TFirstClass和TSecondClass(我必须运行)的所有函数都是相同的


注意:我使用Delphi5。

从声明虚拟方法FirstFunction和SecondFunction的公共基类派生TFirstClass和TSecondClass


Uli.

如果您无法访问TFirstClass和TSecondClass,但仍希望简化代码,那么有一种方法:

创建适配器基类:

type
  TMyAdapter = class(TObject)
  public
    procedure FirstMethod; virtual; abstract;
    procedure SecondMethod; virtual; abstract;
  end;
然后创建子类TFirstClassAdapter和TSecondClassAdapter,并分别为它们提供对TFirstClass或TSecondClass实例的私有引用。添加设置此引用的构造函数。重写适配器类的方法,以便它们调用适应的类

type
  TFirstClassAdapter = class(TMyAdapter)
  private
    fObject: TFirstClass;
  public
    constructor Create(AAdaptedObject: TFirstClass);

    procedure FirstMethod; override;
    procedure SecondMethod; override;
  end;

constructor TFirstClassAdapter.Create(AAdaptedObject: TFirstClass);
begin
  inherited Create;
  fObject := AAdaptedObject;
end;

procedure TFirstClassAdapter.FirstMethod;
begin
  fObject.FirstMethod;
end;

procedure TFirstClassAdapter.SecondMethod;
begin
  fObject.SecondMethod;
end;
另一节课也一样。现在,您只需要决定是创建一次适配器并将其传递给其他人,还是创建一个在任何需要的地方调用的函数,这将为您的具体类提供一个适配器

如果您使用接口实现适配器,那么您甚至不需要自己管理适配器的生命周期


通过这种方式,您可以拥有Ulrich提供的多态行为,但无需更改TFirstClass和TSecondClass。

首先请原谅我的英语不好。
如果不能在响应(适配器和派生自基类)之前执行2个操作,则可以使用RTTI以过程的名称访问过程

必须在发布的章节中声明该程序

如果您有这样的声明:

  TFirstClass = class(TObject)
  published
    procedure FirstFunction;
    procedure SecondFunction;
  end;
  TSecondClass = class(TObject)
  published
    procedure FirstFunction;
    procedure SecondFunction;
  end
如果您具有以下名称,则可以执行类似的操作来执行方法:

  // Acceso a la rutina; TObject is a Base class for 
  // TFirstClass and TSecondClass
  Routine.Data := Pointer(obj as TObject);
  // Devuelve la dirección de un método published; Method for it's name
  Routine.Code := (obj as TObject).MethodAddress('SecondFunction');
  // Not find
  if (Routine.Code = nil) then Exit;
  // execute
  TExecuteMethod(Routine);
您可以在此处看到类似的代码:
* *


问候。

您是否控制所有者?(可以更改类的定义吗?)所有者是什么类型。当您将类型转换为TObject时,我假设使用指针或整数/基数?+1来提出模式。Adapterpattern是一个方便的模式。