Ryan Joseph wrote 6 lines
> On Feb 2, 2020, at 3:23 PM, Sven Barth via fpc-pascal wrote:
>
> As I had explained in the other thread some months ago interfaces in Object Pascal mean literally that the type can be cast to the specified interfaces. Parent interfaces are *not* part of this. If you want this you need to first cast the class to IClassName2, then the "interface inheritance" mechanism can take over.
>
Hmm, isn't that inconsistent given how classes work? if TClassName implements IClassName2 then doesn't it also implement IClassName1 by definition?
You mix inheritance with interface implementation. They are conceptully *not* the same even if they use a similar syntax. Thus they can (and do) behave differently. And that means that you can cast a class instance only if that interface is explicitely implemented.
Look at the following code:
=== code begin ===
program tintftest;
{$mode objfpc}
{$interfaces corba}
type
ITest1 = interface
procedure Test;
end;
ITest2 = interface(ITest1)
procedure Test2;
end;
TTest = class(TObject, ITest1, ITest2)
public
procedure ITest1.Test = ITest1Test;
procedure ITest1Test;
procedure Test;
procedure Test2;
end;
procedure TTest.Test;
begin
Writeln('Test');
end;
procedure TTest.Test2;
begin
Writeln('Test2');
end;
procedure TTest.ITest1Test;
begin
Writeln('ITest1Test');
end;
var
t: TTest;
i1: ITest1;
i2: ITest2;
begin
t := TTest.Create;
i1 := t;
i1.Test;
i2 := t;
i2.Test;
i2.Test2;
end.
=== code end ===
This will print:
=== output begin ===
ITest1Test
Test
Test2
=== output end ===
A class is in no way obliged to implement a interface in the same way as an descendant interface.
This might appear like an obstacle in some case but in the contrary declaring it explicitely allows for much more flexibility. Especially when you're dealing with more complex interface hierarchies.
Regards,
Sven