On Fri, May 10, 2019 at 4:57 PM Sven Barth via fpc-pascal < fpc-pascal@lists.freepascal.org> wrote:
> Hello together! > > We are pleased to announce that Free Pascal now supports the usage of > multiple active helper types per extended type. This feature has been > developed by Ryan Joseph, so thank you very much Ryan. > awesome news. thanks for implementing it dudes, i'm going to update my git to test it! > To enable this feature you need to use the new modeswitch multihelpers. > This will then result in the following code to compile: > > === code begin === > > {$mode objfpc} > {$modeswitch typehelpers} > {$modeswitch multihelpers} > > type > TObjectHelper1 = type helper for TObject > procedure Foo; > procedure Foobar; > end; > > TObjectHelper2 = type helper for TObject > procedure Bar; > procedure Foobar; > end; > > procedure TObjectHelper1.Foo; > begin > Writeln('Foo'); > end; > > procedure TObjectHelper1.Foobar; > begin > Writeln('Foobar1'); > end; > > procedure TObjectHelper2.Bar; > begin > Writeln('Bar'); > end; > > procedure TObjectHelper2.Foobar; > begin > Writeln('Foobar2'); > end; > > var > o: TObject; > begin > o.Foo; > o.Bar; > o.Foobar; // this will call TObjectHelper2.Foobar > end. > > === code end === > > As can be seen in the example above if a member is present in multiple > helpers then it will be resolved by the usual scoping rules. More common > is however is to have helpers in different units: > > === code begin === > > unit test1; > > {$mode objfpc} > {$modeswitch typehelpers} > > interface > > type > TObjectHelper1 = type helper for TObject > function Func: LongInt; > end; > > implementation > > function TObjectHelper1.Func: LongInt; > begin > Result := 1; > end; > > end. > > unit test2; > > {$mode objfpc} > {$modeswitch typehelpers} > > interface > > type > TObjectHelper2 = type helper for TObject > function Func: LongInt; > end; > > implementation > > function TObjectHelper2.Func: LongInt; > begin > Result := 2; > end; > > end. > > program testA; > > uses > test1, test2; > > var > o: TObject; > begin > Writeln(o.Func); // will print 2 > end. > > program testB; > > uses > test2, test1; > > var > o: TObject; > begin > Writeln(o.Func); // will print 1 > end. > > === code end === > > Sidenote: yes, modeswitch typehelpers also allows "type helper" to be > used with classes and records. > > Regards, > Sven -- Silvio Clécio
_______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal