gpt4 book ai didi

delphi - 常量类实例

转载 作者:行者123 更新时间:2023-12-01 21:32:49 24 4
gpt4 key购买 nike

如果我定义一条记录,我可以将该记录的一个实例定义为常量记录,例如

Tunit = record
_name: string;
_scale: real;
end;

const metre: Tunit =
(_name: 'metre';
_scale: 1.0;
)

我需要做类似的事情,其中​​ Tunit 是一个类,meter 是该类的一个实例,但它是一个(特定)实例,其关联字段不能由其他代码更改。我不知道如何实现这一目标。请问有什么想法吗?

最佳答案

有两种方法可以实现类似的效果,具体取决于您的需求:

第一种方法涉及在单元初始化过程中初始化类的实例(记住在相应的终结过程中释放实例)或使用访问器单元函数在第一次访问时初始化实例:

一)

  interface

var
metre : TUnit = NIL; // Can initialise a unit variable

:

implementation

:

initialization
metre := TUnit.Create( ... );

finalization
FreeAndNIL(metre);

end.

注意:如果您的类只是一个数据容器(如您的问题所示),那么您可能会考虑省略终结 Free'ing - 尽管技术上存在内存泄漏,但您实际上不会泄漏任何内容,因为您使用的内存当您的应用程序进程终止时,实例将被回收。如果项目中的其他最终化代码在释放后访问仪表实例,则最终化中的释放可能会导致问题。

我还警告您不要尝试使用任何所谓的“单例”类。在像这样的简单情况下,它们增加了复杂性和开销,但 yield 为零。

b)

  interface

function Metre: TUnit;

implementation

var
_metre : TUnit = NIL; // Can initialise a unit variable


function Metre: TUnit;
begin
if NOT Assigned(_metre) then
_metre := TUnit.Create( ... );

result := _metre;
end;


finalization
FreeAndNIL(metre);

end.

关于最终确定的选择性的相同观察也适用于这种情况。

另请注意,如果性能是一个重要问题并且该访问器函数可能会被大量使用,那么您可以采取进一步的步骤来优化该区域,使用最初初始化为工厂函数的函数指针,该指针将自身替换为首次访问时指向简单无条件访问器函数的指针。

实现它的第二种方法是使用类函数从特殊派生类返回固定值,而不是使用成员数据。然后,您根本不需要实例化该类,也不需要担心如何处置它。我一时记不起 Delphi 2010 现在是否支持类变量以及类函数 - 如果确实如此,那么这也可能是一个答案。但如果您没有使用 Delphi 2010,那么这个问题就毫无意义了。

它看起来有点像:

TMetre = class(TUnit)
class function Name: String; override;
class function Scale: Double; override;
end;

等等

但是我确实想知道...您是否了解标准转换单位和相关的计量单位功能?我之所以这么问,是因为这个问题中的内容看起来可能是 Delphi RTL 的现有方面已经满足的。

关于delphi - 常量类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1937747/

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