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

前端之家收集整理的这篇文章主要介绍了delphi – 如何避免重复转换为后代接口类型?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在制作一个框架(仅供内部使用),该框架在3 o 4 delphi数据库CRUD应用程序中具有通用代码.

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

  1. TContext = class (IContext)
  2. function DB: IDatabase;
  3. function CurrentSettings: ISettings;
  4. ..
  5. end;

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

  1. TCustomer.Initialize(Context: IContext)
  2. TProjectList.Initialize(Context: IContext)
  3. ..

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

  1. IApp1Context = interface (IContext)
  2. procedure DoSomethingSpecificToApp1;
  3. procedure DoOtherThing;
  4. ..
  5. end;

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

  1. (FContext as IApp1Context).DoSomethingSpecificToApp1
  2. (FContext as IApp1Context).DoOtherThing;
  3. ..

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

解决方法

使用临时变量.在方法开始时分配一次,然后在需要的地方使用它.
  1. var
  2. AppContext: IApp1Context;
  3. begin
  4. AppContext := FContext as IApp1Context;
  5.  
  6. AppContext.DoSomethingSpecificToApp1;
  7. AppContext.DoOtherThing;
  8. end;

或者,因为看起来您的IContext对象是对象的字段,所以将IApp1Context变量设置为同一对象的字段.它甚至可以替换IContext字段,因为IApp1Context已经公开了IContext所做的一切.

  1. procedure TCustomer.Initialize(const Context: IContext);
  2. begin
  3. FContext := Context;
  4. FAppContext := FContext as IApp1Context;
  5. // ...
  6. end;

猜你在找的Delphi相关文章