在delphi中分离接口和实现类?

gat*_*ath 2 delphi class

将我的delphi代码分离为接口和实现单元即.

EmployeeIntf.pas看起来像这样

type
 // forward declaration
  TScheduleList = class;
  TDeparment = class;
 TEmployee = class(BDObject)
  ....
    function GetSchedules: TScheduleList;
    function GetDepartment: TDepartment;
 end;

 TEmployeeList = class(DBList)
  ....
 end;

 TEmployeeDM = class(BDDBobject)
  ...
 end;
Run Code Online (Sandbox Code Playgroud)

然后我有两个单元ScheduleIntf.pasDepartmentIntf.pas,它们声明了TScheduleList类和TDepartment类.

然后在我的主单元,它结合了所有单位看起来像这样,

Unit BusinessDomain
Interface
uses
 classes
  {$I Interface\EmployeeIntf.pas}
  {$I Interface\DepartmentIntf.pas}
  {$I Interface\ScheduleIntf.pas}
Implementation
uses
 SysUtils
 {$I Implementation\EmployeeImpl.pas}
 {$I Implementation\DepartmentImpl.pas}
 {$I Implementation\ScheduleImpl.pas}
Initialization
finalization

end.
Run Code Online (Sandbox Code Playgroud)

当我编译它时,编译器抛出一个错误;

*Type TScheduleList is not yet completely defined*
Run Code Online (Sandbox Code Playgroud)

如何在每个单元文件(.pas)中分离这些类,然后在没有编译器抛出此错误的情况下执行转发声明?

课程itselvs是巨大的,我宁愿这样分开他们.

迦特

Uli*_*rdt 15

我的第一个建议是:完全跳过这个$ Include.正如Uwe所写,找到了更像Delphi的解决方案.

如果你真的继续使用$ Include样式:你引用的错误是因为前向声明不适用于"type"块.您转发在一个块中声明TScheduleList,但在不同的块中定义它.要解决此问题,请在*Intf.pas中省略"type"关键字,并在include之前将其插入BusinessDomain.pas中.

  • 我知道你有一个"适用于"这种布局/风格的解决方案,但是我已经准备好投入资金,你将在以后将其改回真正的Delphi方式:)你会失去代码自动化和导航的简便性.蒂姆 (3认同)

Uwe*_*abe 12

我担心,不可能将类声明拆分成多个文件.如果类很大,你应该考虑重新设计.

另一种选择是接口:

type
  IEmployee = interface
    { public properties and methods of an employee }
    ...
  end;

type
  TEmployee = class(BDObject, IEmployee)
    ...
  end;
Run Code Online (Sandbox Code Playgroud)

接口和类声明现在可以驻留在不同的文件中.


Tim*_*vis 7

Ulrich是完全正确的(+1),而你可以操作你的包含文件以这种方式工作,它不会是一个非常好的开发经验给你.

可以把$ Include指令想象成一个简单的文本替换机制,那些使你的单位,好......单位是范围机制(使用部分,类型部分等),它们将更难以在包含文件中使用,这就是为什么包含文件通常被称为xxx.inc而不是xxxx.pas,因为它们通常不会自己作为源文件.这当然使它们在开发环境中非常困难,因为它们实际上只是文本文件而不是适当的可调试单元.

  • 让我们在6个月内再次进行这次对话:-) (4认同)