рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдПрдХ рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧ рдХреЗ рд╡рд░реНрдЧ рдЪрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛

рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?

рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рдХреА рдЬрд░реВрд░рдд рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рд╡рд░реНрдЧреЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдирд╛ред рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ рд╕рднреА рдирд┐рдпрдорд┐рдд рдХреЛрдб рдФрд░ рд╡рдВрд╢рдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд▓реЗрдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдереАред рдЦреИрд░, рдЖрд▓рд╕реАрдкрди, рдЖрдЦрд┐рд░рдХрд╛рд░, рдкреНрд░рддреНрдпреЗрдХ рдмрдЪреНрдЪреЗ рдХреЗ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдЪреАрдЬ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рд╢рд╛рдпрдж рдореИрдВ рдЬреЗрдирд░рд┐рдХ рдХреЛ рдпрд╣рд╛рдВ рдлрдВрд╕рд╛ рд╕рдХрддрд╛ рд╣реВрдВред

рдФрд░ рдЗрд╕рд▓рд┐рдП, рдЖрд╡рд╢реНрдпрдХ рд╡рд░реНрдЧ рдЪрд░ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЙрдирдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдкреЙрдЗрдВрдЯрд░ рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрдХреНрд╖рд╛ рдХреЗ рдПрдХ рд╡рд░реНрдЧ рдЪрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╡рд░реНрдЧ рд╡рд┐рднрд┐рдиреНрди рд╡рд░реНрдЧ-рдЧрдгрд┐рдд рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдЕрдиреВрдард╛ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдмрди рдЬрд╛рдПрдЧрд╛ред

рд╡рд░реНрдЧ рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдРрд╕реЗ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╡рд░реНрдЧ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдЗрд╕ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЗ рдХреНрд▓рд╛рд╕ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди, рд╕рдВрднрд╡рдд: рдЫрд┐рдкреЗ рд╣реБрдП рдХреНрд▓рд╛рд╕рд╕реЗрд▓реНрдл рдХреЗ рдмрдЬрд╛рдп, рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╡рд░реНрдЧ рдХреЗ рдЕрддрд┐рднрд╛рд░рд┐рдд рддрд░реАрдХреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЖрдзрд╛рд░ рдФрд░ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд▓реНрдк:
unit MyStore; interface uses System.Generics.Collections; type TDataBase = class abstract protected type TDataType = class of TDataBase; TDataList = TList<TDataBase>; TDataInfo = array of Integer; PClassVar = ^TClassVar; TClassVar = record cType :TDataType; cObjs :TDataList; cInfo :TDataInfo; end; protected fVar :PClassVar; class function Init(var cVar :PClassVar):Pointer; overload; class procedure Done(var cVar :PClassVar); overload; static; class procedure AddFild( cVar :PClassVar; var Fild); overload; static; public Tag :Integer; procedure Save; constructor Create; virtual; destructor Destroy; override; end; TDataProx<T:class> = class(TDataBase) protected class var cVar :TDataBase.PClassVar; class function Init:T; overload; inline; class procedure Done; overload; inline; class procedure AddFild(var Fild); overload; inline; public constructor Create; overload; override; class function Objs:TList<T>; inline; end; implementation { TDataBase } class procedure TDataBase.AddFild(cVar: PClassVar; var Fild); // static; begin with cVar^ do begin SetLength(cInfo,Length(cInfo)+1); cInfo[Length(cInfo)-1]:=Integer(PByte(@Fild) - PByte(@cType)); end; end; procedure TDataBase.Save; begin with fVar^ do begin end; end; constructor TDataBase.Create; begin with fVar^ do cObjs.Add(Self); end; destructor TDataBase.Destroy; begin with fVar^ do cObjs.Extract(Self); inherited; end; class procedure TDataBase.Done(var cVar: PClassVar); // static; var Obj :TDataBase; begin with cVar^ do begin for Obj in cObjs do begin Obj.Save; Obj.Free; end; cObjs.Free; Finalize(cInfo); end; Dispose(cVar); end; class function TDataBase.Init(var cVar: PClassVar):Pointer; // uses ClassSelf begin New(cVar); with cVar^ do begin cType:=Self; cObjs:=TDataList.Create; Initialize(cInfo); Result:=@cType; // synthetic Object :) end; AddFild(cVar,TDataBase(Result).Tag); end; { TDataProx<T> } class procedure TDataProx<T>.AddFild(var Fild); // inline; begin AddFild(cVar, Fild); end; constructor TDataProx<T>.Create; begin fVar := cVar; // ! inherited; // ! after fVar := cVar; end; class procedure TDataProx<T>.Done; // inline; begin Done(cVar); end; class function TDataProx<T>.Init:T; // inline; begin Result:=Init(cVar); end; class function TDataProx<T>.Objs: TList<T>; // inline begin Result:=TList<T>(cVar.cObjs); end; end. 


рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:

 unit MyData; interface uses MyStore; type TDataA = class(TDataProx<TDataA>) Data :Integer; Note: string; class constructor Init; class destructor Done; class procedure Work; end; TDataB = class(TDataProx<TDataB>) Data :Double; Memo :array of string; class constructor Init; class destructor Done; end; implementation { DataA } class destructor TDataA.Done; begin Done; end; class constructor TDataA.Init; begin with Init do begin AddFild(Data); AddFild(Note); end; end; class procedure TDataA.Work; var Obj :TDataA; begin for Obj in Objs do Inc(Obj.Data,Obj.Tag); end; { DataB } class destructor TDataB.Done; begin Done; end; class constructor TDataB.Init; begin with Init do begin AddFild(Data); AddFild(Memo); end; end; end. 

Source: https://habr.com/ru/post/In181914/


All Articles