Am 22.12.2019 um 04:44 schrieb Ryan Joseph via fpc-pascal:

On Dec 21, 2019, at 10:49 AM, Adriaan van Os <f...@microbizz.nl> wrote:

I had hoped that procedure IMyInterface2.P2 would now be visible as a method of 
TMyClass. This would be quite helpful in implementing multiple-inheritance. But 
no, the implements specifier completely hides it. I assume this has been 
discussed before.
That's exactly what I was ranting about some months back with the idea of "default 
properties". I would expect that syntax to pull the methods names into the current 
namespace and this would be very helpful.

It's by design as Sven pointed out but this makes no sense whatsoever to me. If 
the compiler team agrees I will personally make a mode switch or whatever is 
permitted to accomplish this. :)
Vetoed.

You don't seem to understand what implementing an interface means in Object Pascal. It means that a class can be cast to an interface. It does *not* mean that the interface's methods are available from that class.

Take this:

=== code begin ===

program tintftest;

{$mode objfpc}
{$interfaces corba}

type
  ITest = interface
    procedure Test;
  end;

  TTest = class(TObject, ITest)
  strict private
    procedure Test;
  end;

procedure TTest.Test;
begin
end;

var
  t: TTest;
  i: ITest;
begin
  t := TTest.Create;
  //t.Test; // this does not compile
  i := t;
  i.Test;
end.

=== code end ===

An implementor can decide to have the interface's methods not accessible from outside.

Or take this:

=== code begin ===

program tintftest;

{$mode objfpc}
{$interfaces corba}

type
  ITest = interface
    procedure Test;
  end;

  TTest = class(TObject, ITest)
  public
    procedure ITest.Test = IntfTest;
    procedure IntfTest;
    procedure Test;
  end;

procedure TTest.Test;
begin
  Writeln('Test');
end;

procedure TTest.IntfTest;
begin
  Writeln('IntfTest');
end;

var
  t: TTest;
  i: ITest;
begin
  t := TTest.Create;
  t.Test;
  i := t;
  i.Test;
end.

=== code end ===

This will output

=== output begin ===

PS C:\fpc\git> .\testoutput\tintftest
Test
IntfTest

=== output end ===

So while TTest implements the ITest interface it's methods are not the same as the interface's.

Similar for delegates. The delegation property can be private (mostly protected though to avoid a "unused private symbol" warning), so you only get access to the delegated field by casting the class to the implemented interface.

Your proposal to hoist the methods of a delegated interface would conflict with this. Or it would require an alternative syntax to give the implementor the necessary control of the visibility.

TL;DR: in Object Pascal a class implementing an interface can be cast to that interface, but it does not need to present the methods of said interface.

Regards,
Sven
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to