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原型模式 的相关文章

  • 根据维基百科,为什么“call super”被视为反模式? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 开源 Delphi 包可使用哪些项目选项?

    我写了一些 Delphi 代码 想在 GitHub 上分享 所有代码都根据需要包含在运行时和设计时包中 每个项目有许多项目选项需要设置 输出目录 搜索路径 编译选项等 我设法找到了一些适合我的情况的默认选项 但阅读此处的其他问答很明显有多个
  • 如何根据输入的内容过滤组合框的内容?

    我们有一个包含 100 多个项目的组合框 当我们在组合框中输入字符时 我们想要过滤掉项目 例如 如果我们输入 ac 并单击下拉选项 那么我们希望它仅显示以 ac 开头的项目 我怎样才能做到这一点 也许您会更喜欢使用操作系统内置的自动完成功能
  • 如何将只缓存某些内容的字段添加到ADT?

    我经常需要向 ADT 添加字段 仅记住一些冗余信息 但我还没有完全弄清楚如何又好又高效地做到这一点 说明问题的最好方法是举个例子 假设我们正在使用无类型 lambda 项 type VSym String data Lambda Var V
  • 如何制作抗崩溃的ios应用程序

    我现在正在编写 ios 应用程序一段时间 但我的应用程序仍然经常崩溃 并且需要时间才能使它们变得非常稳定 我觉得这很烦人 那么 有没有关于防崩溃编程ios应用程序的编程模式呢 打开编译器警告 删除所有警告 运行静态分析器 删除所有警告 使用
  • 如何在Delphi中下载一个非常简单的HTTPS页面?

    我尝试了在这里看到的代码 但它不适用于 HTTPS 我需要将此页面作为字符串下载 并在其上添加一些换行符 以便将信息按顺序放入 TMemo 中 怎么做 我尝试使用 Indy 但由于 SSL 问题而失败 我尝试了此页面的解决方案 如何将网页下
  • TDictionary 上的 GetItem 由链接器消除

    我正在使用一个TDictionary of
  • 如何在 Delphi DBLookupComboBox 中选择正确的项目

    我有一个数据库查找组合框连接到数据库查询 那部分工作正常 当我运行程序时数据库查找组合框填充有查询的结果 我想看看数据库查找组合框填充第一项 请选择 当 的时候程序第一次运行或者当一个新项目行动已启动 见下图 另外 如果我正在加载以前保存的
  • 不断断点?如何去除它们?

    我下载了一个用Delphi 2009制作的项目 这也是我使用的 但是有一个断点我无法删除 如果我尝试删除它 它会在程序执行后再次执行 我在其他调试器中遇到了这样的事情 称为硬件断点 但这并不重要 如何删除断点 EDIT Article ht
  • Word 2010 自动化:“转到书签”

    我有一个用 Delphi 7 编写的程序 它打开一个基于模板的新 Word 文档 文档打开后 系统会自动跳转到书签 在模板中预定义 并在其中添加一些文本 以下代码在 Word 2003 中工作正常 但会导致invalid variant o
  • 每次 TDbGrid 的选定位置更改时都会触发什么事件?

    我的项目中有一个 TDbGrid 每次更改所选行时我都试图触发一个事件 行中的任何更改都已经更新了链接到同一数据源的所有数据感知控件 但还需要进行其他更改 我需要一个事件处理程序 我认为 OnColEnter 会起作用 根据帮助文件 它在以
  • 为什么 {$ifopt FINITEFLOAT ON} 无法编译?

    我有这样的构造 ifopt FINITEFLOAT ON message FINITEFLOAT option ON else message FINITEFLOAT option OFF endif 在我的源代码中 它不会编译 这一定是一
  • Delphi AES 库 (Rijndael) 使用 KAT Vectors 进行测试

    对于这两个库 Delphi 加密概要 v 5 2 http code google com p delphidec TurboPower 密码箱 v 2 07 http lockbox seanbdurkin id au tiki list
  • 用于在运行时使用附加信息增强 Java 中现有数据结构的设计模式

    我将从一个小例子开始 想象一个具有几个实体的应用程序 实体A 1 n gt 实体B 1 n gt 实体C 假设我们有一个返回 EnityC 实例列表的服务方法 在 UI 中 我们想要显示 EntityC 但也向仅与 UI 相关的实体添加一些
  • 如何将纹理传递给 DirectX 9 像素着色器?

    我有像素着色器 fxc exe tiles fs T ps 3 0 Fotiles fsc Fctiles fsl struct PSInput float4 Pos TEXCOORD0 float3 Normal TEXCOORD1 fl
  • EOutOfMemory 使用 Delphi 创建大型 XML

    我正在使用 Delphi 从关系数据库中的数据创建 XML 文档 它在小数据集上测试得很好 但是当我尝试将数据集的大小扩展到生产级别时 它最终在节点创建期间因 EOutOfMemory 异常而崩溃 我正在使用放在表单上的 TXMLDocum
  • TListView 中的中心子项目图像

    Is it possible to fix the drawing of subitem images in a TListView so that they are not cut off on the left hand side as
  • Microsoft 的并行模式库:有人想知道移植到 POSIX / Linux 有多困难吗?

    该书已出版 http blogs msdn com b vcblog archive 2011 03 15 10139453 aspx http blogs msdn com b vcblog archive 2011 03 15 1013
  • 为什么 Delphi 变体不能保存对象?

    为什么 Delphi 变体不能保存对象 更重要的是 这种限制背后的原因是什么 你绝对可以storeVariant 变量中的对象 只需将其转换为 NativeUInt 无论如何 对象只是一个指针 obj TObject Create v Na
  • 在比较 Delphi 表单文件的版本时,如何使 Beyond Compare 忽略某些差异

    我使用Beyond Compare 版本3 1 10 来比较不同版本的Delphi Form Files 但我不想看到有关ExplicitTop ExplicitLeft ExplicitHeight 和ExplicitWidth 的差异

随机推荐

  • 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 并且它的属