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是一个方便的模式。