gpt4 book ai didi

delphi - 需要将唯一的整数值与类相关联

转载 作者:行者123 更新时间:2023-12-03 15:05:51 25 4
gpt4 key购买 nike

好吧,我有一个基类,我们将其称为 TFruit。由此产生了各种后代,例如 TAppleTOrange 等。我需要将后代类的属性保存到文件中。

为了能够在加载数据时创建正确的类,每个类都需要有一个 ID,我在写入实际数据之前将其写入文件。目前,我想出了以下方法:

type
TFruit = class
const ID = 0;
end;

TApple = class(TFruit)
const ID = 1;
end;

TOrange = class(TFruit)
const ID = 2;
end;

测试这个,我发现我需要非常小心我声明的类。如果我使用这个:

  var Fruit: TFruit;

Fruit := TOrange.Create;

...那么Fruit.ID将返回。但是,将 Fruit 声明为 TOrange 将产生预期结果 Fruit.ID = 2(有人知道为什么吗?)

所以基本上,我做得对还是有更好的方法?相比之下,必须创建一个类函数并从那里返回一个值似乎非常丑陋(额外的函数声明、实现和代码)。

最佳答案

更容易维护的解决方案是创建一个映射类,在其中注册要转换为整数的所有类。

优点

  • 能够检测重复注册。
  • 独立于您的类(class)结构。
  • 包括转换回类名。

使用

  RegisterClass.Register(0, TFruit);
RegisterClass.Register(1, TApple);
RegisterClass.Register(2, TOrange);

实现

  TRegisterClass = class
private
FList: TStringList;
public
function FindID(AClass: TClass): Integer;
function FindClassName(const ID: Integer): string;
procedure Register(const ID: Integer; AClass: TClass);
end;
...
function TRegisterClass.FindID(AClass: TClass): Integer;
begin
Assert(Assigned(AClass));

Result := -1;
if FList.IndexOf(AClass.ClassName) <> -1 then
Result := Integer(FList.Objects[FList.IndexOf(AClass.ClassName)]);
end;

function TRegisterClass.FindClassName(const ID: Integer): string;
var
I: Integer;
begin
Result := EmptyStr;
for I := 0 to Pred(FList.Count) do
if Integer(FList.Objects[I]) = ID then
begin
Result := FList[I];
Exit;
end;
end;

procedure TRegisterClass.Register(const ID: Integer; AClass: TClass);
begin
if IsAlreadyRegistered(ID) then
raise Exception.Create('Duplicate ID Registration')
else if IsAlreadyRegistered(AClass) then
raise Exception.Create('Duplicate Class Registration');

FList.AddObject(AClass.ClassName, Pointer(ID));
end;

请注意,有更好的结构可以将字符串映射到整数。在没有编译器的情况下编写此代码并且不知道 Delphi5 之外的许多基本结构,我选择了一个明显的实现。

请注意,仍然需要编写 IsAlreadyRegistered 重载函数

关于delphi - 需要将唯一的整数值与类相关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4314637/

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