delphi – 检查类名
发布时间:2020-12-15 09:44:15 所属栏目:大数据 来源:网络整理
导读:我不知道OWNER对象类名.所以我必须检查我的代码中的所有地方: if TObject(OWNER) is TFirstClass then begin TFirstClass(OWNER).FirstFunction; TFirstClass(OWNER).SecondFunction; ...end elseif TObject(OWNER) is TSecondClass then begin TSecondClas
我不知道OWNER对象类名.所以我必须检查我的代码中的所有地方:
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; 有没有更好的办法?因为如果在代码的许多地方有条件,我必须这样做. 注意:我使用的是Delphi 5. 解决方法
如果您无法访问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在his answer中提供的多态行为,但无需更改TFirstClass和TSecondClass. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |