gpt4 book ai didi

delphi - 如何避免重复转换为后代接口(interface)类型?

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

我正在制作一个框架(仅供内部使用),该框架在 3 o 4 delphi 数据库 CRUD 应用程序之间具有通用代码。

mi框架的一个常见对象是TContext,

TContext = class (IContext)
function DB: IDatabase;
function CurrentSettings: ISettings;
..
end;

它被传递给许多其他对象的初始化方法。示例(这将是应用程序代码):

 TCustomer.Initialize(Context: IContext)
TProjectList.Initialize(Context: IContext)
..

每个应用程序都有一些特定的上下文函数(仅从应用程序代码中调用):

 IApp1Context = interface (IContext)
procedure DoSomethingSpecificToApp1;
procedure DoOtherThing;
..
end;

因此,当我创建上下文时,我创建一个 IApp1Context,并将其发送到初始化方法。从框架代码来看,一切都很好,问题是,从应用程序代码中,我不断地从 IContext 转换为 IApp1Context访问具体的App1 功能..所以我所有的应用程序代码看起来像这样(并且它的很多代码都是这样的):

 (FContext as IApp1Context).DoSomethingSpecificToApp1
(FContext as IApp1Context).DoOtherThing;
..

这个东西显然是可用的,但在我看来读起来不太好。也许我有点夸张了;对于这种情况,是否有一种我不知道的巧妙的设计技术?

最佳答案

使用临时变量。在方法开始时分配一次,然后在需要的地方使用它。

var
AppContext: IApp1Context;
begin
AppContext := FContext as IApp1Context;

AppContext.DoSomethingSpecificToApp1;
AppContext.DoOtherThing;
end;

或者,由于您的 IContext 对象看起来像是对象的字段,因此使您的 IApp1Context 变量成为同一对象的字段。它甚至可以替换 IContext 字段,因为 IApp1Context 已经公开了 IContext 所做的一切。

procedure TCustomer.Initialize(const Context: IContext);
begin
FContext := Context;
FAppContext := FContext as IApp1Context;
// ...
end;

关于delphi - 如何避免重复转换为后代接口(interface)类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7802153/

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