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

Reply via email to