gpt4 book ai didi

delphi - delphi中的"descending"记录?

转载 作者:行者123 更新时间:2023-12-03 14:46:40 28 4
gpt4 key购买 nike

我知道你实际上无法从记录中继承任何内容,但我不知道如何用一句话总结我的问题。如果需要,请编辑标题。

我在这里想做的是创建一个某种泛型类型的数组,它可以是 X 种类型之一,该数组将填充这些自定义类型(它们具有不同的字段,这才是重要的)。最简单的方法是只创建一个变体记录数组,每个变体都有自己的类型,但显然不能像这样重新声明标识符:

GenericRec = Record
case SubTypeName: TSubTypeName of
type1name: (SubRec: Type1);
type2name: (SubRec: Type2);
...
typeNname: (SubRec: TypeN);
end;

SubRec 更改为 SubRec1、SubRec2...SubRecN 会使引用变得痛苦,但并非不可能。自从我开始寻找上述问题的替代解决方案以来,我想到了类。

演示我想要实现的目标的明显示例是 TObject,其中的数组可以分配给许多不同的事物。这就是我想要的,但是对于记录(这是不可能做到的),因为我希望能够将记录保存到文件以及读回它们(也因为这是我已经熟悉的东西)。制作我自己的简单类不是问题,从中制作一个后代类来代表我的子类型 - 我可以做到这一点。但是将其写入文件并读回又如何呢?这归结为序列化,我不知道该怎么做。据我所知,这并不容易,并且该类必须是 TComponent 的后代。

TMyClass = Class

如果我像上面那样上课有什么区别吗?它没什么花哨的,最多有 10 个字段,包括一些自定义类型。

将序列化放在一边(只是因为我有很多关于该主题的阅读要做),在这里使用类也可能是不可能的。

此时,我有什么选择?我应该放弃记录并在类里面尝试这个吗?或者仅仅坚持记录并处理变体“限制”会不会那么复杂?我热衷于学习,如果爆炸性的类教学方法能让我变得更聪明,我就会这么做。我也刚刚研究过 TList (从未使用过它),但似乎它与记录混合得不太好,也许可以做到,但这可能超出了我的范围目前联赛。我愿意接受任何建议。我该怎么办?

最佳答案

您将序列化与“通过一次 BlockWrite 调用将所有内容写入磁盘”混为一谈。您可以序列化您想要的任何内容,无论它是来自 TComponent 还是 TPercient

尽管使用单个 BlockWrite 调用编写所有内容一开始看起来很方便,但如果您想要的记录类型要存储任何特别有趣的内容(例如字符串、动态数组、接口(interface)、对象或其他基于引用或指针的类型)。

您可能还会发现变体记录不令人满意,因为您将按照最低公分母进行编码。如果不检查实际包含的类型,您将无法访问记录中的任何内容,即使是最小量的数据的大小也将占用与最大数据类型相同的空间。

这个问题似乎描述了多态性,因此您不妨接受该语言已经为此提供的内容。使用对象数组(或列表,或任何其他容器)。那么就可以使用虚方法来统一对待它们。如果需要,您可以实现记录的动态调度(例如,为每个记录提供一个函数指针,该指针引用一个知道如何处理该记录所包含的数据类型的函数),但最终您可能会发现自己重新发明了类.

关于delphi - delphi中的"descending"记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11253199/

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