我正在制作一个框架(仅供内部使用),该框架在 3 到 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;

10-05 22:43