Einzelnen Beitrag anzeigen

Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#17

AW: Fehlende Mehrfachvererbung bei Schnittstellen

  Alt 18. Jul 2014, 11:01
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (18. Jul 2014 um 11:41 Uhr)
  Mit Zitat antworten Zitat