Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有办法在Delphi接口上实现dynamic_cast以获取底层对象类?_C++_Delphi_C++builder - Fatal编程技术网

C++ 有没有办法在Delphi接口上实现dynamic_cast以获取底层对象类?

C++ 有没有办法在Delphi接口上实现dynamic_cast以获取底层对象类?,c++,delphi,c++builder,C++,Delphi,C++builder,我正在编写代码,以实现跨不同后端系统的一组通用功能。(例如,在不同的订单处理系统中生成销售订单)。我已经抽象了这些功能,并为它们定义了Delphi风格的接口。为了允许在不同的后端系统中分阶段实施,每个系统可以支持不同的功能块。(例如,“提高销售订单”功能)。因此,有一个核心API接口,它允许我们找出安装了哪些功能(有一个功能接口),并获得一个特定的命名功能(其中每个命名功能都有自己的接口) 因此,我将实现为一系列对象类,这些对象类同时实现了IAPICapability接口和特定函数接口(例如IA

我正在编写代码,以实现跨不同后端系统的一组通用功能。(例如,在不同的订单处理系统中生成销售订单)。我已经抽象了这些功能,并为它们定义了Delphi风格的接口。为了允许在不同的后端系统中分阶段实施,每个系统可以支持不同的功能块。(例如,“提高销售订单”功能)。因此,有一个核心API接口,它允许我们找出安装了哪些功能(有一个功能接口),并获得一个特定的命名功能(其中每个命名功能都有自己的接口)

因此,我将实现为一系列对象类,这些对象类同时实现了IAPICapability接口和特定函数接口(例如IAPIRaiseSalesOrder接口)。IAPICapability接口有一个方法CanInstallTo,用于确定是否可以将微粒子功能加载到核心API接口中

我想能够做的是确定我尝试安装到的API是否是此模块的正确类型的API

我最初指定将IInterface传递给CanInstallTo,但我找不到任何方法将其强制转换为对象,以便可以使用动态_强制转换来确定它是否是该类希望插入的内容

查看文档,Delphi接口包括运算符重载以获取底层指针。我希望这可以有效地是一个带有C++表中的VTABLE的对象指针——因为在C++术语中,接口是用多重继承实现的。 但是,我还没有找到可以将其转换为对象指针的代码

我可以在IAPIInterface中包含一个“签名”并进行检查,但这不允许我使用同一个对象类来实现多种类型的后端(使用接口应该允许我这样做)。我可以允许“SupportsSignature”方法实现多种类型的后端。。。但是如果我有一个具有类继承性的对象,我应该能够使用dynamic_cast

目前,我已经更改了规范,将TComponent*传递给CanInstallTo,但这要求将TComponent用作基类,这不是一个问题,但不符合使用抽象接口的一般概念

此代码不起作用,但给出了我尝试执行的操作的想法:

bool TAPICapabilityModule::CanInstallTo(_di_IInterface Target)
{
bool              blRc=false;
TWantedAPIType  * pAPI;

  if((pAPI=dynamic_cast<TWantedAPIType *>(Target))!=NULL)
  { // continue with other checks if needed
    if(pAPI->Capability[MY_CAPABILTY_ID]==NULL)
    {
      blRc=true;
    }
  }
  return(blRc);
}
bool-TAPICapabilityModule::CanInstallTo(\u di\u i接口目标)
{
bool-blRc=false;
TWantedAPIType*pAPI;
如果((pAPI=dynamic_cast(Target))!=NULL)
{//如果需要,继续进行其他检查
如果(pAPI->能力[MY_Capability_ID]==NULL)
{
blRc=真;
}
}
返回(blRc);
}

我现在正在使用TComponent*作为核心API实现,但我想知道是否有人知道如何完全使用接口来完成这项工作?

我发现了一个模板助手函数,它可以完全满足我的要求。我运行的是Rio(10.3.1),它在系统文件systobj.h中实现——这应该包括在中(这反过来可能包括在几乎所有使用RTL的程序中)

这个文件中的相关代码(它正是我想要的,在包装对象指针上的动态_转换)

//--------------------------------------------------------------------------
//对象接口转换帮助程序
// --------------------------------------------------------------------------
结构declspec(uuid({CEDF24DE-80A4-447D-8C75-EB871DC121FD})uuu IObjCastGUIDHolder;
模板
DESTOBJ*_接口对象广播(IInterface*src)
{
if(src)
{
TObject*obj=0;
src->QueryInterface(uuuu-uuidof(uuu-IObjCastGUIDHolder),重新解释cast(&obj));
返回动态_-cast(obj);
}
返回0;
}
它可以这样使用:

bool-TAPICapabilityClass::CanInstallTo(\u di\u i接口目标)
{
bool-blRc=false;
TWantedAPIType*pAPI;
如果((pAPI=dynamic_cast(Target))!=NULL)
{//如果需要,继续进行其他检查
如果(pAPI->能力[MY_Capability_ID]==NULL)
{
blRc=真;
}
}
返回(blRc);
}
从消费应用程序的角度来看,仍然是这样的抽象接口:

void TApplicationUnit::InstallCapability(t组件*pAPI,TObject*pccapability)
{
_底辟;
_可识别性可识别性
if((系统::Sysutils::支持(pAPI,_uuidof(IAPICore),(void**)(&dipi)))&&
(System::Sysutils::Supports(pCapability,_uuidof(iapicability),(void**)(&diCapability)))&&
(可拆卸性->安装到(DIPI)))
{
DIPI->安装能力(可拆卸性);
}
} 
我还没有达到可以正确测试代码的程度(但它可以编译)

在评论中有一些关于是否发布摘要的有效观点 对象的接口是良好的设计。正如我在C++多继承方面看到的那样,我希望能够在抽象类型之间动态地进行转换。用例的设计目标要求对消费应用程序隐藏各种后台系统的实现,但在多个类之间拆分功能需要实现类知道同一实现中的其他类(但不一定知道它们的内部工作)


从我对Delphi所知的一点来看,有一种松散的平行关系,即同一单元中的Delphi类能够以其他类无法访问的方式相互访问,因为它们位于同一单元中。在许多情况下,您希望将抽象接口呈现给消费类,但在实现类的内部,您需要更详细地了解其他类。

RTTI可能有用?感谢您的快速响应。不幸的是,我发现了和