Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Interfaces - Multiple Inheritance (https://www.delphipraxis.net/153524-interfaces-multiple-inheritance.html)

Der schöne Günther 19. Nov 2013 23:08

AW: Interfaces - Multiple Inheritance
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1236634)
Da du aber weißt (aus der Deklaration), daß IChild von IParent abgeleitet ist, kannst du natürlich auch die IParent-Methoden verwenden.

Das offensichtlichste ist mir natürlich wieder nicht aufgefallen, natürlich! Ich finde es trotzdem komisch, dass Supports() angibt, das Interface würde nicht unterstützt. Dagegen kann ich wirklich nichts tun?

himitsu 19. Nov 2013 23:28

AW: Interfaces - Multiple Inheritance
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1236636)
Dagegen kann ich wirklich nichts tun?

Zitat:

Zitat von Uwe Raabe (Beitrag 1236634)
Wenn du willst, daß TChild sowohl IChild als auch IParent supported, dann musst du beide Interfaces angeben.

:?:

Furtbichler 20. Nov 2013 07:19

AW: Interfaces - Multiple Inheritance
 
Sollte 'GetInterface' das Problem nicht lösen?

Dessenungeachtet frage ich mich, was 'Supports' für einen Sinn macht, wenn man damit nicht herausfinden kann, ob eine Instanz ein bestimmtes Interface implementiert. Oder einfach ausgedrückt: Wozu dient 'Supports'? Was es macht, weiß ich mittlerweile, aber wann benötigt man genau diese Funktionalität ("Ist IMyInterface in der Deklaration der Klasse TMyClass enthalten").

Stevie 20. Nov 2013 07:26

AW: Interfaces - Multiple Inheritance
 
Zitat:

Zitat von Furtbichler (Beitrag 1236648)
Sollte 'GetInterface' das Problem nicht lösen?

Dessenungeachtet frage ich mich, was 'Supports' für einen Sinn macht, wenn man damit nicht herausfinden kann, ob eine Instanz ein bestimmtes Interface implementiert. Oder einfach ausgedrückt: Wozu dient 'Supports'? Was es macht, weiß ich mittlerweile, aber wann benötigt man genau diese Funktionalität ("Ist IMyInterface in der Deklaration der Klasse TMyClass enthalten").

Wenn du das weißt, dann solltest du wissen, dass:
a) Supports mehrfach überladen ist, so dass man nicht nur prüfen kann, ob eine Klasse ein Interface implementiert, sondern auch ein Interface auf ein anderes "gecastet" werden kann.

b) Supports nix anderes macht, als letztlich GetInterface bzw GetInterfaceEntry aufzurufen, welches in diesem Fall keinen Eintrag für ein durch Interface Vererbung implizit unterstütztes Interface zurückliefert (wie ich schon in meinem Post von 2010 erwähnte).

;)

P.S. Hab sogar gerade gefunden, warum das so ist: http://edn.embarcadero.com/article/29779 (der erste Satz nach dem Codebeispiel und der letzte Paragraph)

Patito 20. Nov 2013 07:44

AW: Interfaces - Multiple Inheritance
 
Zitat:

Zitat von Furtbichler (Beitrag 1236648)
Sollte 'GetInterface' das Problem nicht lösen?

Dessenungeachtet frage ich mich, was 'Supports' für einen Sinn macht, wenn man damit nicht herausfinden kann, ob eine Instanz ein bestimmtes Interface implementiert. Oder einfach ausgedrückt: Wozu dient 'Supports'?

Ein sinnvoller Anwendungsfall von Supports ist eben gerade der, dass man einen Workaround für die fehlende Unterstützung von Multiple Interface- Inheritance hat.

IReadWrite = interface(IRead, IWrite) geht nicht. Daher kann leider nur
IReadWrite = interface(IRead) oder IReadWrite = interface(IWrite) machen.

Hat man jetzt ein IReadWrite und braucht sowohl IRead als auch IWrite, muss man zur Laufzeit einen der Casts über Supports() machen.

Für COM-Interfaces braucht man ausserdem so ein QueryInterface() um aus einem fremden Pointer ein Interface zu machen.
Als Sprachfeature intern ist die Verwendung von Supports ansonsten aber eher schlechter Stil (so in etwa wie wenn man Klassen und Methoden nicht normal benutzt, sondern alles zur Laufzeit über RTTI und irgendwelche Strings zusammenwurstet).

Furtbichler 20. Nov 2013 07:53

AW: Interfaces - Multiple Inheritance
 
Zitat:

Zitat von Stevie (Beitrag 1236649)
Wenn du das weißt, dann solltest du wissen,

Mein Wissen ist exklusiv durch diesen Thread entstanden und daher ist alles, was Du sonst schreibst Neuland für mich, welches ich dankbar annehme und durchlese.

Zitat:

P.S. Hab sogar gerade gefunden, warum das so ist: http://edn.embarcadero.com/article/29779 (der erste Satz nach dem Codebeispiel und der letzte Paragraph)
Der zweite Satz ist für mich einleuchtender. Blöde Sache, diese Altlasten.

@panino: Ich bekomme niemals heraus, ob meine Klasse/Interface ein Interface implementiert, das nicht direkt in der Klassendeklaration angegeben ist. Das ist blöd.

Es bleibt (für mich) dabei: 'Supports' ist nicht wirklich zu gebrauchen und wer diesbezüglich richtig programmieren will, muss zu .NET wechseln. Ich arbeite gerade damit und schüttle über die Restriktionen, die einem hier zwangsweise begegnen, nur den Kopf.

Der schöne Günther 20. Nov 2013 08:50

AW: Interfaces - Multiple Inheritance
 
Zitat:

Zitat von himitsu (Beitrag 1236638)
beide Interfaces angeben

Ich habe davon bislang immer Abstand genommen da ich mich entweder irre oder man dadurch wieder mit anderen Anomalien zu kämpfen hatte wenn man beispielsweise die Realisierung eines Interfaces an irgendwelche aggregierten Objekte delegieren wollte. Ich teste das noch einmal durch...

Zitat:

Zitat von Furtbichler (Beitrag 1236654)
Blöde Sache, diese Altlasten.

@panino: Ich bekomme niemals heraus, ob meine Klasse/Interface ein Interface implementiert, das nicht direkt in der Klassendeklaration angegeben ist. Das ist blöd.

[...] Restriktionen, die einem hier zwangsweise begegnen[...]

Da geht bei mir auch wirklich der Blutdruck hoch. Statt lustiger Spielereien wie 3D-Firemonkey oder VCL-Styles hätte ich gerne für Nicht-Legacy-Code wenigstens einen Compilerschalter "Sinnvolles Verhalten AN|AUS". Einen Schalter für Spektakel wie Pentium-sicheres FDIV hat man ja auch bekommen.

Uwe Raabe 20. Nov 2013 08:58

AW: Interfaces - Multiple Inheritance
 
Zitat:

Zitat von himitsu (Beitrag 1236638)
Zitat:

Zitat von Der schöne Günther (Beitrag 1236636)
Dagegen kann ich wirklich nichts tun?

Zitat:

Zitat von Uwe Raabe (Beitrag 1236634)
Wenn du willst, daß TChild sowohl IChild als auch IParent supported, dann musst du beide Interfaces angeben.

:?:

OK, vielleicht unklar ausgedrückt: supported = liefert bei
Delphi-Quellcode:
Supports
true.

Bezieht sich halt auf meinen Beispielcode im Beitrag #5 weiter oben. TClass2 deklariert nur IChild bei den unterstützen Interfaces und deshalb kann man IFather nicht über Supports abrufen. Will man das, muss man es so deklarieren wie bei TClass1.

stahli 7. Jun 2014 11:56

AW: Interfaces - Multiple Inheritance
 
Zitat:

Zitat von Patito (Beitrag 1236653)
IReadWrite = interface(IRead, IWrite) geht nicht. Daher kann leider nur
IReadWrite = interface(IRead) oder IReadWrite = interface(IWrite) machen.

Ich will das gleich nochmal anprangern (weil ich gerade auf das Problem gestoßen bin).

Ist das in XE6 immer noch so?
Eine Mehrfachvererbung von Interfaces wäre wirklich sehr übersichtlich.

Dass Supports die Vererbungen nicht nachvollziehen kann und in den Klassen daher die einzelnen Interfaces angegeben werden müssen finde ich weniger schlimm.

Aber ein Interface von mehreren anderen abzuleiten wäre schon sehr hilfreich.

Sir Rufo 7. Jun 2014 12:13

AW: Interfaces - Multiple Inheritance
 
Zitat:

Zitat von stahli (Beitrag 1261668)
Zitat:

Zitat von Patito (Beitrag 1236653)
IReadWrite = interface(IRead, IWrite) geht nicht. Daher kann leider nur
IReadWrite = interface(IRead) oder IReadWrite = interface(IWrite) machen.

Ich will das gleich nochmal anprangern (weil ich gerade auf das Problem gestoßen bin).

Ist das in XE6 immer noch so?
Eine Mehrfachvererbung von Interfaces wäre wirklich sehr übersichtlich.

Dass Supports die Vererbungen nicht nachvollziehen kann und in den Klassen daher die einzelnen Interfaces angegeben werden müssen finde ich weniger schlimm.

Aber ein Interface von mehreren anderen abzuleiten wäre schon sehr hilfreich.

Dadurch gibt es doch nur heilloses Durcheinander und da eine Klasse mehrere Interfaces implementieren kann ist es auch überflüssig.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:08 Uhr.
Seite 2 von 4     12 34      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz