gpt4 book ai didi

delphi - 面向对象和序列化

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

考虑一个像这样的界面

IMyInterface = interface
procedure DoSomethingRelevant;
procedure Load (Stream : TStream);
procedure Save (Stream : TStream);
end;

以及几个实现该接口(interface)的类:

TImplementingClass1 = class (TInterfacedObject, IMyInterface)
...
end;
TImplementingClass2 = class (TInterfacedObject, IMyInterface)
...
end;
...

我有一个包含 IMyInterface 实现者列表的类:

TMainClass = class
strict private
FItems : TList <IMyInterface>;
public
procedure LoadFromFile (const FileName : String);
procedure SaveToFile (const FileName : String);
end;

现在的问题是:如何以面向对象的方式加载主类,特别是项目列表?在调用项目的虚拟 Load 方法之前,我必须创建它们,因此必须知道它们的类型。在我当前的实现中,我存储项目数量,然后存储每个项目

  • 类型标识符(IMyInterface 获得额外的 GetID 函数)
  • 调用项目的 Save 方法

但这意味着在加载过程中我必须做类似的事情

ID := Reader.ReadInteger;
case ID of
itClass1 : Item := TImplementingClass1.Create;
itClass2 : Item := TImplementingClass2.Create;
...
end;
Item.Load (Stream);

但这似乎不是非常面向对象,因为每次添加新的实现者时我都必须修改现有代码。有没有更好的方法来处理这种情况?

最佳答案

一种解决方案是实现一个工厂,其中所有类都使用唯一的 ID 进行 self 注册。

TCustomClassFactory = class(TObject)
public
procedure Register(AClass: TClass; ID: Integer);
function Create(const ID: Integer): IMyInterface;
end;

TProductionClassFactory = class(TCustomClassFactory)
public
constructor Create; override;
end;

TTestcase1ClassFactory = class(TCustomClassFactory);
public
constructor Create; override;
end;

var
//***** Set to TProductionClassFactory for you production code,
// TTestcaseXFactory for testcases or pass a factory to your loader object.
GlobalClassFactory: TCustomClassFactory;

implementation

constructor TProductionClassFactory.Create;
begin
inherited Create;
Register(TMyImplementingClass1, 1);
Register(TMyImplementingClass2, 2);
end;

constructor TTestcase1ClassFactory.Create;
begin
inherited Create;
Register(TMyImplementingClass1, 1);
Register(TDoesNotImplementIMyInterface, 2);
Register(TDuplicateID, 1);
Register(TGap, 4);
...
end;

优点

  • 您可以从当前加载方法中删除条件逻辑。
  • 一个可检查 ID 是否重复或缺失的位置。

关于delphi - 面向对象和序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1231569/

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