将对象转换为没有 TInterfacedObject 作为基类的接口类型

2024-04-13

我需要一个没有引用计数的实现接口的类。我做了以下事情:

  IMyInterface = interface(IInterface)
      ['{B84904DF-9E8A-46E0-98E4-498BF03C2819}'] 
      procedure InterfaceMethod;
  end;

  TMyClass = class(TObject, IMyInterface)
  protected
      function _AddRef: Integer;stdcall;
      function _Release: Integer;stdcall;
      function QueryInterface(const IID: TGUID; out Obj): HResult;stdcall;
  public
      procedure InterfaceMethod;
  end;

  procedure TMyClass.InterfaceMethod;
  begin
      ShowMessage('The Method');
  end;

  function TMyClass.QueryInterface(const IID: TGUID; out Obj): HResult;
  begin
      if GetInterface(IID, Obj) then
          Result := 0
      else
          Result := E_NOINTERFACE;
  end;

  function TMyClass._AddRef: Integer;
  begin
      Result := -1;
  end;

  function TMyClass._Release: Integer;
  begin
      Result := -1;
  end;

缺乏引用计数效果很好。但我担心的是我无法投射TMyClass to IMyInterface using as操作员:

var
  MyI: IMyInterface; 
begin
  MyI := TMyClass.Create as IMyInterface;

我被给予

[DCC 错误] E2015 运算符不适用于此操作数类型

TMyClass源自于TInterfacedObject- 即我可以进行这样的转换而不会出现编译器错误。显然我不想使用 TInterfacedObject 作为基类,因为它会使我的类引用计数。为什么不允许这样的转换以及如何解决它?


无法使用的原因as在您的代码中,您的类没有明确列出IInterface在其支持的接口列表中。即使您的界面源自IInterface,除非您实际列出该接口,否则您的类不支持它。

因此,最简单的解决方法是像这样声明您的类:

TMyClass = class(TObject, IInterface, IMyInterface)

您的班级需要实施的原因IInterface这就是编译器所依赖的来实现as cast.

我想指出的另一点是,一般来说,您应该避免使用接口继承。总的来说,它没什么用处。使用接口的好处之一是您可以摆脱实现继承带来的单一继承约束。

但无论如何,所有Delphi接口自动继承自IInterface http://docwiki.embarcadero.com/RADStudio/en/Object_Interfaces#IInterface_and_Inheritance所以在你的情况下没有必要指定这一点。我会这样声明你的界面:

IMyInterface = interface
  ['{B84904DF-9E8A-46E0-98E4-498BF03C2819}'] 
  procedure InterfaceMethod;
end;

更广泛地说,您应该尽量不要在接口中使用继承。通过采用这种方法,您将减少耦合,从而带来更大的灵活性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将对象转换为没有 TInterfacedObject 作为基类的接口类型 的相关文章

  • 我应该害怕使用 UDP 进行客户端/服务器广播通话吗?

    我在过去的两天里阅读了每一篇StackOverflow问题和答案 以及googling当然 关于印地TCP and UDP协议 以便决定在我的用户应用程序和 Windows 服务之间的通信方法中应该使用哪一种 从我目前所看到的来看 UDP是
  • 检查值是否实现接口的说明

    我读过 Effective Go 和其他类似这样的问答 golang接口合规性编译类型检查 https stackoverflow com questions 17994519 golang interface compliance com
  • Pylance:“property”与“int”不兼容

    from typing extensions import Protocol class IFoo Protocol value int class Foo IFoo property def value self gt int retur
  • 如何追踪“地址 00000000”的访问违规

    我知道如何创建 map 文件来在错误消息包含实际地址时跟踪访问冲突错误 但是如果错误消息说怎么办 Access violation at address 00000000 Read of address 00000000 我从哪里开始寻找这
  • 如何向标准集合编辑器添加图标?

    我有一个自定义控件 它利用TCollection and TCollectionItem 在集合编辑器中 我想向每个列表项添加图标 该列表项由内部TImageList 在其父组件内 集合项本身代表图标 我想在这个编辑器中显示相应的图标 如何
  • 有人能解释一下 C# 中接口的具体用法吗?

    有人能解释一下 C 中接口的具体用法吗 msdn 对此没有帮助吗 http msdn microsoft com en us library 87d83y5b aspx http msdn microsoft com en us libra
  • Delphi - 如何获取 USB 可移动硬盘和记忆棒的列表?

    在我的应用程序 Delphi 中 我需要列出所有 USB 存储设备 这些可以是闪存棒or外部存储驱动器 有一个Jvcl成分JvDriveCombo 并且它有DriveType属性 问题是我是否选择DriveType Fixed那么除了外部驱
  • FreePascal x64 上系统单元函数的汇编调用

    我有一些 Delphi 汇编代码 可以在 Win32 Win64 和 OSX 32 上编译并正常工作 XE2 但是 由于我需要它在 Linux 上工作 所以我一直在考虑编译它的 FPC 版本 到目前为止 Win32 64 Linux32 6
  • 在Delphi 7中,为什么我可以给const赋值?

    我将一些 Delphi 代码从一个项目复制到另一个项目 发现它在新项目中无法编译 但在旧项目中可以编译 代码看起来像这样 procedure TForm1 CalculateGP const Price money 0 begin Pric
  • Auto-value-gson出现接口错误,注册一个InstanceCreator?

    我有一个如下所示的接口类 public interface Species String name And a Human实现的类 AutoValue使用类型适配器 AutoValue public abstract class Human
  • Delphi应用程序窗口z顺序和MainFormOnTaskBar属性

    我正在维护一个最初用 Delphi 7 编写并移植到 Delphi XE 的应用程序 使用 Windows 7 我们遇到了一些问题 例如模态窗口出现在主窗口下方 以及最终无法与程序交互 因为用户需要与模态窗体交互 而这是不可能的 因为它位于
  • 对象的引用计数

    在我的代码中 我使用一个小的数据存储类 它是在不同的地方创建的 为了避免内存泄漏并简化事情 我想使用引用计数 所以我这样做了 type TFileInfo class TInterfacedObject IInterface 并删除了我对
  • 如何用不同的颜色绘制选定的列表框项目?

    是否可以更改 TListBox 中的项目选择焦点颜色和文本颜色 当项目中未启用主题或列表框样式设置为所有者绘制时 项目周围的选择将被涂成蓝色 我相信这是由系统的外观设置全局定义的 我想将所选项目的颜色更改为自定义颜色 举个例子 结果会是这样
  • 如何使 StringGrid 的列适合网格的宽度?

    我已经寻找解决方案很长时间了 但没有任何运气 有谁知道一个简单的方法来做到这一点 例如 我想拉伸网格的第二列以适应网格的宽度 Use the ColWidths财产 像这样 with StringGrid1 do ColWidths 1 C
  • 在 Delphi 或 C++ Builder 中使用 Chromium Edge WebView2 [重复]

    这个问题在这里已经有答案了 既然 Microsoft Chromium Edge 已经最终确定 是否可以在 Delphi 或 C Builder 中使用它 据我了解 它是基于WebView2成分 是否有一个组件 例如TWebView2或者E
  • 将图像加载到 TImageList 并读取它们?

    我试图通过将 jpg 转换为 bmp 然后将其保存到 imagelist1 来将 jpg 加载到图像列表中 从上到下的代码片段 Selectdir 有效 fileexists 部分有效 这用于加载文件夹中的所有图像 所有图像都以 0 jpg
  • 如何从该 JAVA 文件中提取 Delphi 类以与 Android 一起使用?

    我的Delphi XE7项目需要与FTDI FT311 Android 配件芯片 http www ftdichip com Products ICs FT311D html 他们帮助提供了一个 Android 演示 其中包括他们的 JAV
  • 为什么 Delphi 中的 ADO Next 记录处理速度变慢?

    我有一个多年前开发的 Delphi 4 程序 它使用Opus 直接访问 http sourceforge net projects directaccess 按顺序搜索 Microsoft Access 数据库并检索所需的记录 Delphi
  • 为什么应该首选 Java 类的接口?

    PMD https pmd github io 将举报以下违规行为 ArrayList list new ArrayList 违规行为是 避免使用 ArrayList 等实现类型 而是使用接口 以下行将纠正违规行为 List list ne
  • CharInSet 不适用于非英文字母?

    我已经将应用程序从 Delphi 2007 更新到 Delphi 2010 一切都很顺利 除了一条编译正常但不起作用的语句 If Edit1 Text 1 in S then ShowMessage Found else ShowMessa

随机推荐

  • 在 Rails 中显示某些用户的博客文章

    好吧 开始学习 Rails 当然是从编写带有个人博客的服务 例如 livejournal 开始 我有帖子脚手架和用户模型 感谢 Devise 现在我试图在 url 中显示某些用户的所有帖子 例如 username posts 但真的无法理解
  • OSX 10.9.5 上 libc 中的 wordexp 是否存在泄漏?

    Is wordexp https developer apple com library prerelease mac documentation Darwin Reference ManPages man3 wordexp 3 html
  • 错误:在 firefox 中使用 getBBox() 时出现 NS_ERROR_FAILURE

    我想使用方法获取BBox 用于获取 SVG 中创建的元素的宽度和高度 在这里我提供了我的代码 它在 chrome 中给出结果 但在 firefox 中不给出结果 请帮我解决一下 try console log document getEle
  • 仅 mysqldump 模式,模式更新不丢失

    我正在考虑在提交更改之前使用 git pre commit hook 导出 MySQL 数据库模式 以便其他开发人员可以使用 git 存储库中的 SQL 脚本更新自己的数据库 默认情况下 mysqldump 我正在使用 no data 会在
  • 无法使用 @WebMvcTest 自动装配 MockMvc [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在尝试在 Spring Boot 应用程序中测试我的 REST 控制器 这是我的测试课 import com binar ke
  • WCF服务操作名称

    有没有办法配置 App Insights 在监视 WCF 服务时收集操作名称 所有请求都通过 URL 只是以 svc 结尾的 POST 集中在一起 因此没有简单的方法来确定在服务上调用了哪个特定操作 是否需要一个自定义遥测初始化程序来以某种
  • 如何告诉 PyCharm 将生成的函数放在当前函数下方而不是上方?

    我有一个函数调用foo 在我里面main函数及对应函数foo尚不存在 我希望 PyCharm 使用如下所示的轻浆选项为我生成该函数 原则上它是有效的 但是 我希望生成新函数below main而不是在它之前 之上 gt 我如何告诉 PyCh
  • mPDF 不会在 pdf 文件上打印希伯来语

    我使用时遇到这个问题mPDF用希伯来语 这些是我正在使用的 mPDF 和 PHP 版本 PHP 5 6 25 mPDF 最新 这是我使用的 PHP 代码片段
  • 使用 PowerShell 的 Start-Process cmdlet 传递变量参数

    各位晚上好 我使用的命令行将参数作为变量传递给以下脚本 以便在我从此脚本中调用的另一个 ps1 中运行 每当我尝试从命令行传递参数时 我都会收到以下错误 Start Process 找不到接受的位置参数 争论 有人可以帮忙吗 感谢您抽出宝贵
  • 获取 JRuby jar 路径

    如同this https stackoverflow com questions 8743854 how to get the path of the jruby warbler jar file问题 我想知道如何获取当前jar文件的路径
  • 依赖规则顺序

    为了计算两个相同长度列表之间的汉明距离 我使用foldl hamm A B 0 R 有了这个定义hamm 4 hamm A A V V hamm A B V0 V1 A B V1 is V0 1 第一条规则的删减可以防止不必要的回溯 然而
  • 当 AJAX 向具有无效证书的服务器请求时如何抑制 SSL 错误

    我有这个代码 function newXMLHttpRequest var xmlHttp try xmlHttp new ActiveXObject Msxml2 XMLHTTP catch e try xmlHttp new Activ
  • 为什么我不能从 System.Object 中提取 ushort,然后将其转换为 uint? (C#)

    我正在操作列表中的项目System Management ManagementObjectCollection 这些项目中的每一个都是System Management ManagementObject其中包含按字符串索引的属性 看 for
  • 处理硬退回/投诉还是只是坚持黑名单?

    在这里向 NOOB 发送电子邮件 计划使用 Amazon SES 发送交易电子邮件 尝试了解如何处理退回邮件或被标记为垃圾邮件的电子邮件 SES 会自动将退回邮件 投诉收件人添加到黑名单中 我读到的有关禁止名单的内容 https sesbl
  • “User.count”没有改变 1 - Rails

    What User count didn t change by 1手段以及如何解决它 以下是控制台的命令行 这是我经历过的失败bundle exec rake test我正在寻找一种方法来修复它们 bundle exec rake tes
  • 如何等待WebViewBrush.Redraw()完成(UWP打印)?

    我有一个基本的 UWP 应用程序 带有嵌入式 WebView 可呈现相当大的 HTML 文档 最多 500 个字母大小的打印页面 我想添加对打印该 HTML 文档的支持 这是我的方法 为了支持分页 我使用 div style height
  • 类似heroku的git设置?

    说到 git 我是个菜鸟 我怎样才能得到它 这样我就可以做类似的事情git push production master并拥有我自己的远程存储库镜像 目前 每当我跑步时git push production master I get 错误
  • 闪亮反应性解释(使用 ObserveEvent)

    我希望使用下面的简化代码作为示例 清楚地了解 Shiny 的反应行为 当 y 在应用程序中更新时 图表也会更新 当 x 在应用程序中更新时 图表不会更新 我已阅读 Shiny 的教程 我的理解是 鉴于我已将 test 和plot 函数包装在
  • JQUERY - 单击后将 CSS 类添加到 BUTTON 元素 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我想在单击
  • 将对象转换为没有 TInterfacedObject 作为基类的接口类型

    我需要一个没有引用计数的实现接口的类 我做了以下事情 IMyInterface interface IInterface B84904DF 9E8A 46E0 98E4 498BF03C2819 procedure InterfaceMet