Delphi原型模式

2023-12-03

我想知道,Delphi 的 RTTI 中是否有任何东西可以像 C# 中的 MemberwiseClone 一样简单地实现原型模式。 我看到了这种模式的一些 Delphi 实现,其中正在创建一个新对象 (TMyObject.Create),并且它的属性分配有来自原型对象的值。我可能是错的,但如果我们以相同的基本方式创建对象,我看不到该模式的好处。

谢谢。


Object.MemberwiseClone 方法使一个shallow遵循一些非常简单的规则并利用 .NET 垃圾收集器的工作方式的对象副本。

  • 参考文献只是简单地复制。这包括字符串和对任何内容的引用object.
  • 值类型是按位复制的(创建相同的克隆)。

关于值类型的部分可以很容易地用 Delphi 复制。使用 Delphi 复制引用类型行为虽然在技术上很容易,但不会提供预期的结果:Delphi 代码预计.free它创建的对象,并且它使用owner-owned确保这种情况发生的范例。通常的模式是从析构函数中释放所有者对象创建的对象。如果您对对象进行浅复制,则会导致失败。这是一个例子:

  • 对象 A 拥有对对象 B 的引用。
  • 我们创建对象 C 作为对象 A 的浅表副本。对象 C 现在包含对对象 B 的引用。
  • 我们释放对象 A:A.Free;
  • 我们释放对象 B:B.Free;- 这会自动调用B.Free,但不幸的是,当我们释放 A 时,B 已经被释放了!

我们可以尝试一个deep-copy正如大卫所建议的,但这也带来了一些同样困难的问题:

  • 并非所有对象都应该被复制,例如因为它们封装了对现实世界资源的引用(例如:TFileStream)。
  • 其他一些对象无法进行深度复制,因为它们本质上是单例。并且没有通用的方式来表示“这个对象是单例,进行简单的引用复制,不要进行深层复制”。示例:我们复制吗Application?
  • 如果您进行深层复制,则可能会出现循环引用,您需要处理这些问题。这并不简单,当您从集合中的某个项目开始复制时,您可能会发现自己回到了集合的父级,即:不完全是预期的结果。
  • 不加区别的深度应对可能会占用意想不到的内存量并导致意外的内存泄漏。再次考虑集合 -> 项目 -> 复制项目示例,您最终得到“项目”的副本,但由于意外的反向链接,整个 COLLECTION 被复制。

将所有这些放在一起,我们只能得出一个结论:我们不能有一个通用的目的,Delphi 相当于MemberwiseClone。对于具有不复杂交互的更简单的对象,我们可以有部分相似的外观,但这远没有那么吸引人!

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

Delphi原型模式 的相关文章

  • Windows 更新后 Active 设置为 False 时 TIdHttpServer 冻结

    我们有一个 Indy 版本 10 6 1 5235 TIdHttpServer 服务 多年来一直与 Delphi 2007 配合良好 在最新的 Windows 更新 KB4338815 和 KB4338830 之后 我们注意到当 TIdHt
  • 当前线程中的单例

    我的单身人士如下 public class CurrentSingleton private static CurrentSingleton uniqueInstance null private static object syncRoo
  • 你们中有多少人进行三层设计?

    多年来 三层设计一直是我数据库驱动应用程序的标准设计理念 它从未让我失望过 对于那些练习它的人 描述一下你的层次 我发现很多人混淆了业务层和数据访问层 使其更像是 2 5 层设计 我更喜欢使用存储过程将数据层几乎完全移动到数据库中 并且在代
  • 是否有任何库可以解析Java中的“数字表达式”,例如1,2-9,33-

    我不认为这很难 只是写起来很乏味 一些小的免费 如啤酒 库 我可以在其中放入像 1 2 9 33 这样的字符串 它可以告诉我给定的数字是否与该数字匹配表达 就像大多数程序的打印范围对话框一样 仅匹配奇数或偶数 或匹配每个 2 mod 5 或
  • 我可以在 Delphi 中使用字符串“IsEmpty”方法吗

    内河码头文件 IsEmpty 方法 http docs embarcadero com products rad studio delphiAndcpp2009 HelpUpdate2 EN html delphivclwin32 Syst
  • 通过 Javascript 不断查询服务器 - 好主意吗?

    我有一个小型网站 大约有 5 到 10 名管理员 我已将其设置为监视每个管理员正在执行的操作 添加项目 删除项目等 我的管理面板中有一个列表 显示了集体管理部门之前执行的 10 项活动 今天 我决定每 30 秒进行一次自我更新 我的问题很简
  • 在 XMLDocument 中使用 DocumentElement 时发生访问冲突

    当我尝试使用时 我总是遇到访问冲突DocumentElement of the XMLDocument 我创造XMLDocument基于某些文件的存在 错误信息 项目project1 exe引发异常类EAccessViolation 消息
  • 如何将 Delphi Chromium Embedded (TChromium) 组件的声音静音?

    我需要将某个声音静音TChromium组件来制作无声浏览器 主要问题是在 Windows XP 上 当我将浏览器的声音静音时 它会静音整个系统的声音 有没有办法让电脑静音TChromium成分 我已经成功使用以下代码 procedure C
  • C# 模式匹配

    我对 C 有点陌生 我正在寻找一个字符串匹配模式来执行以下操作 我有一个像这样的字符串 该书将在 唐宁街 11 号接待处 并将由主要医疗保健人员参加 我需要创建一个 span 标签来使用 startIndex 和 length 突出显示一些
  • 包含其他类集合的类的设计(操作方法)

    如何设计涉及其他类集合的类 一般示例 A 工作空间包含数量Projects A Project包含大量资源 Each Resource可能包含大量Files 所以这里标识的类可以是 Workspace Project Resource 和
  • 如何将 SOLID 原则应用到现有项目中

    我对这个问题的主观性表示歉意 但我有点卡住了 我希望之前处理过这个问题的人能够提供一些指导和建议 我有 现在已经成为 一个用 C 2 0 编写的非常大的 RESTful API 项目 并且我的一些类已经变得巨大 我的主要 API 类就是一个
  • 如何为每个线程自动全局初始化/取消初始化某些内容?

    我有一个单位initialization and finalization部分 该单元包含一个复杂的对象 该对象在initialization并毁于finalization 但是 该对象还包含一个 ADO 连接 这使得跨线程使用它时出现问题
  • PHP:我是否将事件驱动编程与信号感知接口(信号和槽/观察者模式)混淆了?

    我看到很多人说 Symfony2 Zend Framework 2 等都是事件驱动的 在桌面世界中 通过事件驱动编程 我了解到应用程序每当其状态发生变化时都会通知其观察者 由于 PHP 应用程序是无状态的 因此无法执行此类操作 IE 让观察
  • 这种模式叫什么?软锁?

    这是我有时必须编写的一些代码 大部分与 UI 内容结合使用 并且总是与可能意外陷入无限循环的事件相关 public class MyClass public event EventHandler MyEvent private bool I
  • Delphi XE 和 OmniXML:使用 SelectNode()?

    我将以下 XML 片段作为一个更大的 XML 文件的一部分 我正在使用最新的 OmniXML 快照进行处理
  • 池和集群之间的区别

    从最纯粹的角度来看 它们感觉像是相同的概念 两者都管理资源 节点集并控制来自外部组件或由外部组件进行的访问 通过池 您可以向池借用这些资源 节点 也可以从池中归还这些资源 节点 对于集群 您在资源 节点前面有一个负载均衡器 并且您可以向负载
  • 如何指定从 Delphi TStream 读取的组件的所有者?

    我正在从流中读取组件 并且希望能够指定 Owner 属性 var TComponent comp stream Seek 0 soFromBeginning comp stream ReadComponent nil 谁拥有 comp 我该
  • 如何使用 VCL 类的接口 - 第 2 部分 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 继续我之前关于使用 VCL 接口的调
  • Delphi 2010 控制闪烁

    我一直在从 XP 操作系统升级或迁移我们的软件 以便能够在 Windows 7 下编译和运行 我们的软件开始出现我们在 Windows XP 下没有注意到的问题 目前 我正在处理 TForm 上闪烁的用户定义控件 它似乎时不时地闪烁 但并非
  • 在 Delphi 中,我的 DLL 中是否必须分配函数的返回 pchar

    我有一个 DLL 其中有一个返回 pchar 的函数 以避免必须使用 borlndmm 我最初所做的是将字符串转换为 pchar 并返回 Result pChar SomeFuncThatReturnsString 但 90 的情况下我都能

随机推荐

  • Application Insights 不捕获信息级别日志记录

    我有一个简单的 Asp Net Core Web API 应用程序 对于这个例子 我遵循了这里的官方文档 https learn microsoft com en us azure azure monitor app asp net cor
  • 使用VBA和数组公式方法进行多条件VLookup

    因此 当需要在 VBA 中创建具有多个条件的 VLookUp 时 我们的想法是利用漂亮的数组公式方法及其背后的想法 问题 我们可以将其翻译成VBA吗 INDEX range1 MATCH 1 A1 range2 B1 range3 C1 r
  • Python 排列下没有相同元素的集合的笛卡尔积

    我有一些集合 我想对其进行笛卡尔积 效果很好 但是 我想删除这个新集合中在元素排列下相同的所有元素 例如 采用以下代码 import itertools as ittools x 2 y 3 z 5 flist list ittools p
  • DocumentDB 子查询

    我正在尝试从包含双重嵌套数组的大型文档投影到数组的扁平表示中 但我不知道如何继续 我有类似这样的文件 id 1 themeId e4d3549c 2785 4067 83d6 f396d2212776 enabled false archi
  • .NET Compact 框架 - 使滚动条更宽

    有什么方法可以使 net 紧凑框架的 winforms 中的滚动条更宽吗 我希望应用程序对手指友好 但对于手指不小的人来说 滚动条非常窄 EDIT 问题出在 ListView DataGrid 等组件中的内置滚动条 Windows Mobi
  • 如何在 XAMPP 中将 MariaDB 更改为 MySQL?

    A 首先要做的事情 Google 先生没有帮助我找到任何对我的问题的答复 多于 是的 我在这里阅读了相反问题的解决方案如何在 Windows 上 5 分钟内将 XAMPP 中的 MySQL 升级到 MariaDB 这对我没有帮助 MySQL
  • 从远程服务器运行 jupyter 笔记本的脚本

    我有一台运行 jupyter 笔记本的服务器 Ubuntu 服务器 16 04 以及一台本地计算机 Mac 我在其中使用 google chrome 来可视化这些笔记本 为此 我必须 在服务器中运行 jupyter Notebook jup
  • RegEx 字符串查找两个字符串并删除文件中其余文本

    我需要用记事本 查找并删除文本文件中的其余部分 我希望你使用 RegeX 来查找 thban 的变体 该变量后面始终最多有 5 个字符 参见点 使用我的搜索字符串 它击中了最后一行 但击中了整行 我只想保留这个词 当这有效时 我也想保留包含
  • 无法使用 Facebook Marketing API 获取暂停的广告见解

    我编写了这个脚本 该脚本返回广告列表及其统计信息 但显然我只获得了活动广告的见解 而不是暂停的广告 对于暂停的广告 我只是获得了广告活动名称及其 id 我尝试使用如下所示的过滤 但它不起作用 first https graph facebo
  • 如何使用 Spring Data JPA 规范创建自定义查询? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 在我的 Spring Boot 应用程序中 我使用 JPA 规范创建了自定义过滤 如上所述使用 JPA 规范搜索和过滤 Spring Boot 但是 我需要连接多个表并构建一个W
  • 如何修复此 SQL 插入语句中的语法错误?

    第一次在这里发布海报 我正在 VBA Access 数据库 中创建 SQL 插入语句 但当我最终准备好通过我创建的表单进行插入时 我不断收到语法错误 似乎无法弄清楚我在这个声明中出了什么问题 因为过去同样的格式对我有用 我在论坛上寻找已经回
  • MUI 依赖错误 npm install @mui/icons-material

    npm install mui icons material npm ERR code ERESOLVE npm ERR ERESOLVE unable to resolve dependency tree npm ERR npm ERR
  • Typescript 无法推断函数对象的正确参数类型

    我写了一个更新函数 它接受一个对象 T 以及一个 更新程序 对象 它采用与以下相同的键 或子集 T并提供更新原对象对应值的函数 type UpdaterObj
  • 在空手道中使用 cURL 实现 API 自动化

    我是空手道新手 我正在自动化 API 测试 需要上传 gt 50MB 的大文件 当我用空手道这样做时 我收到错误 Broken Pipe 根据这个问题测试时管道损坏 写入失败 gt 允许的最大内容长度我可以使用 cURL 来执行此请求 它工
  • R中按虚部对复向量进行排序

    roots lt polyroot c 5 4 3 2 1 我想按虚部的升序对根进行排序 默认情况下sort函数按实部的升序对其进行排序 我已经阅读了文档 但我仍然不知道如何调整参数或编写命令 有人可以帮忙吗 Use Im函数提取虚部并对其
  • HTML5时间标签的使用

    我可以使用如下 HTML 时间标签吗
  • iPhone/iPad 上的自动对焦表单元素

    我正在尝试创建一个 Web 应用程序 在页面加载时自动将文本输入框聚焦 但是 我知道移动 Safari 不支持 自动对焦 属性 我需要它自动对焦的原因是因为我正在开发一个 Web 应用程序 可以这么说 它基本上要求用户使用蓝牙扫描仪将输入发
  • 如何将shellcode解码为ascii

    我有一些 shellcode 当我转换为 ascii 时 它不会输出文本 它只是乱码 x24 x11 xff xff x24 x04 x27 x0f x24 x02 x10 x46 x01 x01 x01 x0c x1e x20 xff x
  • 仅使用 Jackson 将超类字段序列化为 JSON

    我正在用 Jackson 序列化一个类的实例 仅序列化此实例的超类的字段的最佳方法是什么 目前我必须向子类中的每个方法添加 JSONIgnore 注释 有更好的方法吗 假设您可以直接通过以下方式控制序列化过程ObjectMapper 您可以
  • Delphi原型模式

    我想知道 Delphi 的 RTTI 中是否有任何东西可以像 C 中的 MemberwiseClone 一样简单地实现原型模式 我看到了这种模式的一些 Delphi 实现 其中正在创建一个新对象 TMyObject Create 并且它的属