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