将我的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.pas和DepartmentIntf.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中.
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)
接口和类声明现在可以驻留在不同的文件中.
Ulrich是完全正确的(+1),而你可以操作你的包含文件以这种方式工作,它不会是一个非常好的开发经验给你.
可以把$ Include指令想象成一个简单的文本替换机制,那些使你的单位,好......单位是范围机制(使用部分,类型部分等),它们将更难以在包含文件中使用,这就是为什么包含文件通常被称为xxx.inc而不是xxxx.pas,因为它们通常不会自己作为源文件.这当然使它们在开发环境中非常困难,因为它们实际上只是文本文件而不是适当的可调试单元.