Bei Mehrfachvererbung will man auf einen bekannten Parent casten können. (Man will z.B. ein Interface
als Parameter an eine Prozeduren übergeben können, die als Parameter ein ParentInterface erwartet).
Bei diesem Usecase stimme ich dir zu.
Leider geht das in Delphi eben nicht ganz ohne Bastelei, daher ist sowas leider immer wieder ein Thema...
Als große Bastelei würd ich es nicht bezeichnen, allerdings kann man es nicht designtechnisch 100%ig sauber lösen,
da es ein Implementierungsdetail wird und nicht über die Interfacedefinition ersichtlich ist.
Zudem hat man leider keine Compile time safety.
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
IBar = interface
['{F2BDC6D3-6E79-48EF-99A9-94DE53C035DC}']
procedure DoIt;
end;
IBaz = interface
['{3E99A294-48EF-4E2A-B077-562462997EA7}']
procedure DoIt;
end;
IFoo = interface{(IBar, IBaz)}
['{F2173B9B-43A5-4631-A08B-7D64102F1867}']
end;
TFoo = class(TInterfacedObject, IBar, IBaz, IFoo) // in C#: Foo : IFoo
protected
procedure DoIt;
end;
procedure TFoo.DoIt;
begin
Writeln('DoIt')
end;
procedure DoSomething(const bar: IBar);
begin
bar.DoIt;
end;
var
foo: IFoo;
begin
foo := TFoo.Create;
DoSomething(foo as IBar);
Readln;
end.
P.S: Ich hab mich gerade mal mit meinem Kollegen zusammen gesetzt, der C# beherrscht und uns angeschaut, was diese "Multiple Interface Inheritance" in C# so macht.
Wir sind zu dem Schluss gekommen, dass es letztlich nur Syntax Sugar ist, was dafür sorgt, dass eine Klasse die ein Interface implementiert, welches von verschiedenen anderen "abgeleitet" ist, diese auch implementiert. Auch beim Übergeben eines solchen Interfaces an eine Methode, welche eins der Elterninterfaces erwartet, benötigt man dann keinen Cast, sondern kann es so übergeben. Letztlich ist es aber dasselbe wie ich oben im Delphi Code geschrieben habe, nur ein wenig typensicherer.
Im Übrigen lässt C# ein foo.DoIt() nicht zu und quittiert es mit einem "ambiguous call" Compilerfehler.
Und auch die Reflection zeigt einem, dass die Klasse alle 3 Interfaces implementiert, obwohl man eigentlich nur IFoo hingeschrieben hat.