如何避免重复转换为后代接口类型?

pra*_*mer 7 delphi frameworks

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

mi框架的一个共同目标是TContext,

TContext = class (IContext)
  function DB: IDatabase;
  function CurrentSettings: ISettings;
  ..
 end;
Run Code Online (Sandbox Code Playgroud)

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

 TCustomer.Initialize(Context: IContext)
 TProjectList.Initialize(Context: IContext)
 ..
Run Code Online (Sandbox Code Playgroud)

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

 IApp1Context = interface (IContext)
   procedure DoSomethingSpecificToApp1;
   procedure DoOtherThing;
   ..
 end;
Run Code Online (Sandbox Code Playgroud)

所以当我创建一个Context时,我创建一个IApp1Context,并将其发送到初始化方法..从框架代码一切都很好,问题是从应用程序代码我不断地从IContext转换为IApp1Context来访问特定的App1函数..所以我的应用程序代码看起来像(和它的很多代码):

 (FContext as IApp1Context).DoSomethingSpecificToApp1
 (FContext as IApp1Context).DoOtherThing;
 ..
Run Code Online (Sandbox Code Playgroud)

事情显而易见,但在我看来并不好读.也许我夸张了; 这种情况有一种巧妙的设计技巧,我不知道吗?

Rob*_*edy 9

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

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

  AppContext.DoSomethingSpecificToApp1;
  AppContext.DoOtherThing;
end;
Run Code Online (Sandbox Code Playgroud)

或者,因为看起来您的IContext对象是对象的字段,所以使您的IApp1Context变量成为同一对象的字段.它甚至可以取代该IContext领域,因为它IApp1Context已经暴露了IContext它所做的一切.

procedure TCustomer.Initialize(const Context: IContext);
begin
  FContext := Context;
  FAppContext := FContext as IApp1Context;
  // ...
end;
Run Code Online (Sandbox Code Playgroud)