AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Fehlende Mehrfachvererbung bei Schnittstellen
Thema durchsuchen
Ansicht
Themen-Optionen

Fehlende Mehrfachvererbung bei Schnittstellen

Ein Thema von Der schöne Günther · begonnen am 17. Jul 2014 · letzter Beitrag vom 18. Jul 2014
Antwort Antwort
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.487 Beiträge
 
Delphi 12 Athens
 
#1

AW: Fehlende Mehrfachvererbung bei Schnittstellen

  Alt 18. Jul 2014, 12:07
Danke, du hast den Problemkreis sehr anschaulich beschrieben.
Der Delphicompiler müsste nur zwei Dinge zusätzliche beherschen:
Delphi-Quellcode:
TFoo = class(TInterfacedObject, IFoo) // IBar, IBaz, alle Eltern durch den Compiler versteckt mit angelegt}

DoSomething(foo); // (foo as IBar) duch den Compiler automatische Abfrage des passenden Elter
Das vermisse ich eigentlich schon fast so lange, wie ich mit Interfaces in Delphi arbeite.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Fehlende Mehrfachvererbung bei Schnittstellen

  Alt 18. Jul 2014, 12:24
Danke, du hast den Problemkreis sehr anschaulich beschrieben.
Der Delphicompiler müsste nur zwei Dinge zusätzliche beherschen:
Delphi-Quellcode:
TFoo = class(TInterfacedObject, IFoo) // IBar, IBaz, alle Eltern durch den Compiler versteckt mit angelegt}

DoSomething(foo); // (foo as IBar) duch den Compiler automatische Abfrage des passenden Elter
Das vermisse ich eigentlich schon fast so lange, wie ich mit Interfaces in Delphi arbeite.
Es geht ja mit Delphi schon so:
Delphi-Quellcode:
procedure DoSomethingWithBar( ABar : IBar );
procedure DoSomethingWithBaz( ABaz : IBaz );

TFoo = class( TInterfacedObject, IBar, IBaz, IFoo )
...
end;

var
  Foo : TFoo;
begin
  Foo := TFoo.Create;
  DoSomethingWithBar( Foo );
  DoSomethingWithBaz( Foo );
end;
Das Hauptproblem ist aber hierbei, dass nach dem Aufruf von DoSomethingWithBar( Foo ); die Foo-Instanz sich in Rauch auflöst. Somit müsste man entweder TFoo von TPersistentInterface ableiten und explizit freigeben
Delphi-Quellcode:
TFoo = class( TInterfacedPersistent, IBar, IBaz, IFoo )
end;

var
  Foo : TFoo;
begin
  Foo := TFoo.Create;
  try
    DoSomethingWithBar( Foo );
    DoSomethingWithBaz( Foo );
  finally
    Foo.Free;
  end;
end;
oder sich eben zusätzlich eine IFoo Referenz merken.
Delphi-Quellcode:
var
  Foo : TFoo;
  FooIntf : IFoo;
begin
  Foo := TFoo.Create;
  FooIntf := Foo;
  DoSomethingWithBar( Foo );
  DoSomethingWithBaz( Foo );
end;
oder man hat ARC und dann klappt es einfach so ohne dieses Gedöns.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: Fehlende Mehrfachvererbung bei Schnittstellen

  Alt 18. Jul 2014, 20:13
Es geht ja mit Delphi schon so:
*snip*
Das hast du dir aber nur so hingebogen, weil foo von TFoo ist und nicht wie im Beispiel oben von IFoo , worum es auch hier eigentlich geht.

Ich kann dir nicht sagen, was C# da genau macht, wenn man ein IFoo an ein IBar oder IBaz übergibt (hab mir den IL Code nicht angeschaut). Aber dadurch, dass dort fest steht, "wenn IFoo implementiert wird, dann ist auch IBar und IBaz implementiert" ist sichergestellt, dass ein Cast von IFoo auf IBar oder IBaz immer erfolgreich ist.

Und genau das geht in Delphi ebend nicht.

Der Delphicompiler müsste nur zwei Dinge zusätzliche beherschen:
Delphi-Quellcode:
TFoo = class(TInterfacedObject, IFoo) // IBar, IBaz, alle Eltern durch den Compiler versteckt mit angelegt}

DoSomething(foo); // (foo as IBar) duch den Compiler automatische Abfrage des passenden Elter
Das vermisse ich eigentlich schon fast so lange, wie ich mit Interfaces in Delphi arbeite.
Exakt. Ich werd mal nachfragen, ob sowas mal angegangen werden könnte.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (18. Jul 2014 um 20:16 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.401 Beiträge
 
Delphi 12 Athens
 
#4

AW: Fehlende Mehrfachvererbung bei Schnittstellen

  Alt 18. Jul 2014, 20:28
[delphi]
TFoo = class(TInterfacedObject, IFoo) // IBar, IBaz, alle Eltern durch den Compiler versteckt mit angelegt}
Nö.

Denn was ist, wenn jemand nicht will, daß das Objekt auch alle Vorfahren der supporteten Interfaces supported?


Delphi hat nunmal eine strenge Typsicherheit und sowas würde das total aufweichen,
was dann schnell mal Probleme mit überladenen Methoden ergibt, da am Ende dann jede Interface-Variable wie IInterface aussieht.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (18. Jul 2014 um 20:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: Fehlende Mehrfachvererbung bei Schnittstellen

  Alt 18. Jul 2014, 20:37
Denn was ist, wenn jemand nicht will, daß das Objekt auch alle Vorfahren der supporteten Interfaces supported?
Dann leite deine Interfaces halt nicht voneinander ab, so dass der Compiler die nicht dort einfügt?

Die ganzen Devs, die mit C# programmieren, müssen ja echt arme Schweine sein, da sie mit solchen grausamen Problem zu kämpfen haben ... /ironie off
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (18. Jul 2014 um 20:39 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.688 Beiträge
 
Delphi 12 Athens
 
#6

AW: Fehlende Mehrfachvererbung bei Schnittstellen

  Alt 18. Jul 2014, 20:42
Denn was ist, wenn jemand nicht will, daß das Objekt auch alle Vorfahren der supporteten Interfaces supported?
Dann leite deine Interfaces halt nicht voneinander ab, so dass der Compiler die nicht dort einfügt?
Dann ist der Wunsch nach automatischem Einbinden der Parent-Interfaces ebenfalls obsolet.

Hier beißen sich einfach zwei Anwenderwünsche. Die aktuelle Implementation bietet aber einen Möglichkeit, das gewünschte trotzdem zu erreichen (durch explizites Aufführen der Interfaces), während ein implizites Einbinden der Parent-Interfaces nicht so einfach verhindert werden kann. Ergo: der aktuelle Ansatz ist flexibler.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: Fehlende Mehrfachvererbung bei Schnittstellen

  Alt 18. Jul 2014, 21:31
Hier beißen sich einfach zwei Anwenderwünsche. Die aktuelle Implementation bietet aber einen Möglichkeit, das gewünschte trotzdem zu erreichen (durch explizites Aufführen der Interfaces), während ein implizites Einbinden der Parent-Interfaces nicht so einfach verhindert werden kann. Ergo: der aktuelle Ansatz ist flexibler.
Der Wunsch, dass ein Elterninterface nicht explizit aufgenommen wird, ist imho rein theoretisch, denn man muss ja die "geerbten" Methoden sowieso implementieren. Und angenommen, IFoo "erbt" von IBar, kann ich ein IFoo derzeit immernoch einem IBar zuweisen. Aber wenn ich ein IFoo frage, "hey Supports(foo, IBar)" sagt es NÖ! Wie unlogisch ist das denn bitte?

Die aktuelle Implementierung ist designtechnisch komplett Tinnef und nur so weil Microsoft irgendwann mal Scheiße gebaut hat mit ihrer COM Implementierung. Er ist nicht flexibler sondern einfach unsafe.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz