visto che oramai c'ero ho semplificato l'esempio
non si tratta di PartialClass, ma di scrivere OOP in modo da splittare per design una classe complessa
ci sono 4 file:
- test_split.lpr (programma principale)
- uwork_main.pas (classe complessa da splittare)
- unit_work_split_1(split 1)
- unit_work_split_2(split 2)
programma principale
notare che, per chi deve far uso della classe da splittare, basta mettere in uses uwork_main e non le classi splittate
program test_split;
uses uwork_main;
begin
with TMainObject.Create do
try
WriteLn(LeggiMessaggioIT);
WriteLn(LeggiMessaggioEN);
finally
Free;
end;
end.
segue la definizione della classe principale
notare che
- LeggiMessaggioIT e LeggiMessaggioEN sono definite ma il loro funzionamento è demandato ad altre classi (che sono in uses sotto interface)
- le istanze delle classi che si occupano delle operazioni complesse, vengono create solamente se servono
unit uwork_main;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, unit_work_split_1, unit_work_split_2;
type
{ TMainObject }
TMainObject = class
private
FWorkerIT: TMainObject_WorkerIT;
FWorkerEN: TMainObject_WorkerEN;
public
constructor Create;
destructor Destroy; override;
function LeggiMessaggioIT: string;
function LeggiMessaggioEN: string;
end;
implementation
{ TMainObject }
constructor TMainObject.Create;
begin
FWorkerIT:=nil;
FWorkerEN:=nil;
end;
destructor TMainObject.Destroy;
begin
FreeAndNil(FWorkerIT);
FreeAndNil(FWorkerEN);
inherited Destroy;
end;
function TMainObject.LeggiMessaggioIT: string;
begin
if not Assigned(FWorkerIT) then
FWorkerIT:=TMainObject_WorkerIT.Create;
result := FWorkerIT.Read;
end;
function TMainObject.LeggiMessaggioEN: string;
begin
if not Assigned(FWorkerEN) then
FWorkerEN:=TMainObject_WorkerEN.Create;
result := FWorkerEN.Read;
end;
end.
operazione complessa splittata 1
unit unit_work_split_1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils;
type
{ TMainObject_WorkerIT }
TMainObject_WorkerIT = class
public
function Read: string;
end;
implementation
{ TMainObject_WorkerIT }
function TMainObject_WorkerIT.Read: string;
begin
result:='tutto andrà bene!';
end;
end.
operazone complessa splittata 2
unit unit_work_split_2;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils;
type
{ TMainObject_WorkerEN }
TMainObject_WorkerEN = class
public
function Read: string;
end;
implementation
{ TMainObject_WorkerEN }
function TMainObject_WorkerEN.Read: string;
begin
result:='everything will be fine!';
end;
end.