AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Interfaces - Multiple Inheritance

Offene Frage von "Stevie"
Ein Thema von ThE_-_BliZZarD · begonnen am 6. Aug 2010 · letzter Beitrag vom 8. Jun 2014
Antwort Antwort
Seite 2 von 4     12 34      
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#11

AW: Interfaces - Multiple Inheritance

  Alt 20. Nov 2013, 00:08
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Interfaces - Multiple Inheritance

  Alt 20. Nov 2013, 00:28
Dagegen kann ich wirklich nichts tun?
Wenn du willst, daß TChild sowohl IChild als auch IParent supported, dann musst du beide Interfaces angeben.
$2B or not $2B
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#13

AW: Interfaces - Multiple Inheritance

  Alt 20. Nov 2013, 08:19
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").
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: Interfaces - Multiple Inheritance

  Alt 20. Nov 2013, 08:26
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)
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (20. Nov 2013 um 08:37 Uhr)
  Mit Zitat antworten Zitat
Patito

Registriert seit: 8. Sep 2006
108 Beiträge
 
#15

AW: Interfaces - Multiple Inheritance

  Alt 20. Nov 2013, 08:44
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).

Geändert von Patito (20. Nov 2013 um 08:49 Uhr)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#16

AW: Interfaces - Multiple Inheritance

  Alt 20. Nov 2013, 08:53
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.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#17

AW: Interfaces - Multiple Inheritance

  Alt 20. Nov 2013, 09:50
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...

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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Interfaces - Multiple Inheritance

  Alt 20. Nov 2013, 09:58
Dagegen kann ich wirklich nichts tun?
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 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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#19

AW: Interfaces - Multiple Inheritance

  Alt 7. Jun 2014, 12:56
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  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
 
#20

AW: Interfaces - Multiple Inheritance

  Alt 7. Jun 2014, 13:13
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.
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
Antwort Antwort
Seite 2 von 4     12 34      


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 10:46 Uhr.
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