I just made a first attempt to use generics. Trying different things I figured out that the appended code compiles without any error message in FPC 2.6.0RC1
1. Is this behavior intended (generic objects)? I didn't find anything like that in the docs 2. Replacing "object" at (1) with "class" gives an error when compiling 3. In my case the specialization should only work if _ResType is TType or derived, as certain fields and functions/procedures are read / executed Is there currently a way to do this typesafe (my version is a hack, I believe) ? If not, maybe this would be an interesting feature for FPC. Maybe I'm trying to do the manager in a way, that isn't the right one - other suggestions are welcome - but as this is on a developer maillist (I know), my question mainly concerns the general generics part. Thanks A.v.P. ============================================================ program Test; {$mode objfpc}{$H+} uses Classes; {$R *.res} type TType = object RefCount : Word; constructor Init; destructor Done; function GetCount : Word; end; // manages a list of _ResType-Objects generic TManager<_ResType> = object //(1) // _ResType must be TType or detrieved, howto define this?? type PResType = ^_ResType; public constructor Create; destructor Destroy; function GetRefCount : Word; // stuff to manage Resource-array private Resource : array of PResType; // array of pointer to specialized type of generic end; TResManager = specialize TManager<TType>; constructor TType.Init; begin RefCount := 3; WriteLn('TType.Init done...'); end; destructor TType.Done; begin WriteLn('TType.Done...'); end; function TType.GetCount : Word; begin Result := Self.RefCount; end; constructor TManager.Create; begin SetLength(Resource, 2); Resource[0]^.Init; // No problem here WriteLn('Manager.Create done...'); end; destructor TManager.Destroy; begin Resource[0]^.Done; // No problem here WriteLn('Manager.Destroy done...'); end; function TManager.GetRefCount : Word; begin Result := Resource[0]^.RefCount; // direct access // or: //Result := Resource[0]^.GetCount; // helper function end; Var TT : TResManager; begin TT.Create; WriteLn(TT.GetRefCount); // if commented then 'no problem' else 'Access violation' TT.Destroy; end. ============================================================ An unhandled exception occurred at $0000000000411D90 : EAccessViolation : Access violation $0000000000411D90 line 66 of Test.lpr $0000000000411DF6 line 76 of Test.lpr _______________________________________________ fpc-devel maillist - fpc-devel@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-devel