gpt4 book ai didi

delphi - 如何在 Delphi 7 中将一个接口(interface)转换为另一个接口(interface)?

转载 作者:行者123 更新时间:2023-12-03 18:30:47 24 4
gpt4 key购买 nike

我遇到了以下问题:

我有一个类,它是使用 Delphi 7 XML 数据绑定(bind)向导(新建 -> 其他 -> XML 数据绑定(bind))从 xsd 文件生成的。

我需要找到一种方法来为生成的代码添加方法:

IXMLGlobeSettingsType = interface(IXMLNode)
['{9A8F5C55-F593-4C70-85D2-68FB97ABA467}']
{ Property Accessors }
function Get_General: IXMLGeneralSettingsType;
function Get_Projector: IXMLProjectorSettingsType;
function Get_LineMode: IXMLLineDrawingSettingsType;

{ Methods & Properties }
property General: IXMLGeneralSettingsType read Get_General;
property Projector: IXMLProjectorSettingsType read Get_Projector;
property LineMode: IXMLLineDrawingSettingsType read Get_LineMode;

//procedure SetDefault; {To be added}
end;

接口(interface)由相应的类实现,也是向导生成的:

TXMLGlobeSettingsType = class(TXMLNode, IXMLGlobeSettingsType)
protected
{ IXMLGlobeSettingsType }
function Get_General: IXMLGeneralSettingsType;
function Get_Projector: IXMLProjectorSettingsType;
function Get_LineMode: IXMLLineDrawingSettingsType;
public
procedure AfterConstruction; override;
end;

为了定义我自己对生成代码的扩展,我定义了以下接口(interface):

IDefaultable = interface
procedure SetDefault;
end;

具有以下实现类:

DefaultableXMLGlobeSettingsType = class(TXMLGlobeSettingsType, IDefaultable)
public
procedure SetDefault;
end;

但是,我刚刚意识到 Delphi 7 不允许我将一个接口(interface)转换为另一个接口(interface)(甚至从一个接口(interface)转换为一个对象)。所以下面的代码会报错:

defaultSettings : IDefaultable;    
FGlobeSettingsIntf: IXMLGlobeSettingsType; // FGlobeSettingsIntf is in fact a DefaultableXMLGlobeSettingsType

// some code

defaultSettings := FGlobeSettingsIntf as IDefaultable; // error: operator not applicable to this operand type

我几乎被困在这里。如何解决这个错误?在 Delphi 7 中有没有一种方法(即使是一种丑陋的方法)将接口(interface)转换为一个对象,然后再转换回另一个接口(interface)。

最佳答案

defaultSettings := FGlobeSettingsIntf as IDefaultable;
// error: operator not applicable to this operand type

此错误表明 IDefaultable 的定义不包含 GUID。如果没有 GUID,就不可能查询接口(interface),而这正是 as 运算符在此上下文中所做的。

as 运算符与右侧的接口(interface)一起使用时,通过调用 IInterface.QueryInterface 来实现。这需要一个 GUID 与界面相关联。

通过在声明 IDefaultable 时添加 GUID 来解决问题。

关于delphi - 如何在 Delphi 7 中将一个接口(interface)转换为另一个接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45220069/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com