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
Seite 1 von 3  1 23      
Der schöne Günther

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

Fehlende Mehrfachvererbung bei Schnittstellen

  Alt 17. Jul 2014, 18:28
Die Frage ist so dumm, ich habe mir ernsthaft überlegt, sie unter anderem Namen zu stellen. Hoffentlich ist es nur die Hitze.

Nehmen wir an, wir haben eine Schnitstelle "Messgerät" und zwei weitere Schnittstellen, die jeweils davon erben. Und wir haben eine Implementation welche diese beiden implementieren wird.

Siehe Bild im Anhang.


Nun habe ich Code der nur Sinn macht wenn ich ein Objekt habe, das diese beiden Schnittstellen implementiert. Da der TFluxkompensator (im Beispiel) nicht die einzige Implementation bleiben wird, möchte ich die Klasse hier nicht ins Spiel bringen- Nur die beiden Interfaces.

Meine Frage: Ich komme also wohl nicht drum herum, mit mindestens zwei verschiedenen Referenzen (Typ IMessgerätKontrollierbar und IMessgerätLivedatenfähig ) zu arbeiten. Das wäre noch vollkommen ok, aber ich bin stark verunsichert, wann ich welche Referenz verwenden sollte, wollte ich eine Methode von IMessgerät verwenden? Klar, die Auswirkungen sind dieselben, aber ich sehe mich jedes mal in Erklärungsnot Warum diese Referenz, warum nicht die andere?

Im Endeffekt fehlt mir eine Typdefinition die sagt: "Implementiert beide Interfaces". Mehrfachvererbung bei Interfaces geht ja in Delphi nicht. In Java hätte ich die Frage nicht stellen brauchen. C++ sowieso nicht In C# weiß ich nicht.

Was habe ich nun für Alternativen?
  • Eine Referenz vom Obertyp IMessgerät und runtercasaten wenn man es braucht
  • Drei Referenzen und immer die allgemeingültigste nehmen
  • Eine andere Möglichkeit. In meiner panischen Internetsuche stieß ich hier öfter auf das "Specification Pattern", verstehe aber auf Anhieb kein Wort.


Das ähnelt auch etwas der Frage
http://www.delphipraxis.net/180380-v...paramater.html
wo versucht wurde, Generics mit "Typ A oder Typ B, beides ok" einzuschränken.


Ergänzung: So würde ich es mit Java machen.

Ich bin für jeglichen Gedankensturm höchst dankbar.
Miniaturansicht angehängter Grafiken
durr.png  

Geändert von Der schöne Günther (17. Jul 2014 um 19:06 Uhr) Grund: Ergänzung hinzugefügt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Fehlende Mehrfachvererbung bei Schnittstellen

  Alt 17. Jul 2014, 18:33
Zusammenführen (Mehrfachvererbung) ist nunmal grundsätzlich nirgendwo möglich.

Aber es verbietet keiner einem TMessgerät die beiden Interfaces zu implementieren, selbst wenn sie von einem Vorfahren abgeleitet sind.


Vererbung bei Interfaces würde ich persönlich aber eh nur zur Versionierung verwenden.
Die neue Version implementiert die alten Schnittstellen (also erbt sie Diese einfach) und bietet zusätzlich neue/weitere Schnittstellen an.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: Fehlende Mehrfachvererbung bei Schnittstellen

  Alt 17. Jul 2014, 18:36
Richtig. Es realisiert beide. Das ist ja auch nicht das Problem.

Der TFluxkompensator (oder andere Klassen) selbst sind nicht das Problem. Es geht um den Code der sich mit Messgeräten befassen soll, die sowohl Livedaten bereitstellen als sich auch steuern lassen. Wie ich den am besten aufziehe: Habe ich hier (für ein Objekt) zwei verschiedene Variablen oder gibt es bessere Wege in Delphi?

Geändert von Der schöne Günther (17. Jul 2014 um 18:39 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Fehlende Mehrfachvererbung bei Schnittstellen

  Alt 17. Jul 2014, 18:51
Interfaces lassen sich inzwischen (fast) wie Objekte casten.
- harte Casts sind zwar verboten, da unterschiedliche Interfaces auch unterschiedliche Referenzzeiger (Pointer-Adressen) besitzen,
im gegensatz zu Klassen-Typcasts, welche alle die selbe Referenz (Adresse) besitzen.
- aber soft-casts (AS) sind erlaubt
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: Fehlende Mehrfachvererbung bei Schnittstellen

  Alt 17. Jul 2014, 18:56
Also du würdest mit einer IMessgerät-Referenz arbeiten und jedes mal (da es klar ist dass die Instanz beide Unter-Interfaces implementiert) runtercasten?

Delphi-Quellcode:
type TMessgeräteBehandler = class
   protected var
      myMessgerät: IMessgerät;
   public
      constructor Create(myMessgerät: IMessgerät);
      procedure behandleGerät();
   
end;

procedure TMessgeräteBehandler.behandleGerät();
begin
   if not myMessgerät.störungsfrei() then [...]
   
   WriteLn(
      'Aktuelle Temperatur: '
      + (myMessgerät as IMessgerätLivedatenfähig).getTemperatur().toString()
   );
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Fehlende Mehrfachvererbung bei Schnittstellen

  Alt 17. Jul 2014, 18:59
Also grundsätzlich arbeite ich dann immer mit dem Typen, welcher am Meisten benötigt wird und der Rest wird gecastet.
Wenn kurz hintereinander mehrfach auf das andere Interface zugegriffen wird, dann wird in einer Temp-Variable kurz zwischengespeichert. (oder im extremen Notfall auch mal ein WITH)

Aber du kannst den Cast auch intern machen.
s := myMessgerät.Livedaten.getTemperatur.toString;
Livedaten castet intern und gibt als Result ein IMessgerätLivedatenfähig zurück.
iMessgerät erbt dann vom Wichtigeren und referenziert das Andere.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (17. Jul 2014 um 19:02 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: Fehlende Mehrfachvererbung bei Schnittstellen

  Alt 17. Jul 2014, 19:05
Als Ergänzung vielleicht noch: So würde ich es in Java machen:

Code:
class App
{
   public static void main (String[] args) throws java.lang.Exception
   {
      IBoth myVar = new BothImplementer();
      myVar.subMethod1();
      myVar.subMethod2();
   }
}

interface IBase {
   // Stub
}

interface ISub1 extends IBase {
   void subMethod1();
}

interface ISub2 extends IBase {
   void subMethod2();
}

// Reines Tagging-Interface
interface IBoth extends ISub1, ISub2 {}

// Muss das Tagging-Interface implementieren
class BothImplementer implements ISub1, ISub2, IBoth {
   public void subMethod1() {
      System.out.println("submethod1");
   }
   public void subMethod2() {
      System.out.println("submethod2");
   }
}
In Delphi ist die Deklaration von IBoth nicht möglich.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Fehlende Mehrfachvererbung bei Schnittstellen

  Alt 17. Jul 2014, 19:22
Schlimm ist ja, daß selbst ein Singlepasscompiler, wie Delphi, theoretisch Mehrfachvererbung anbieten könnte,
also rein von den "sichtbaren" Schnittstellen, welche der Programmierer sieht. (vor dem Compilieren)

Man würde einfach nur beim neuen "kombinierten" Objekt/Interface die direkten Schnittstellen der Vorfahren nochmals durch den Compiler jagen und dabei die bekannten Fehlermeldungen werfen, wenn sich etwas überschneidet.
Zitat:
[dcc32 Fehler] Unit23.pas(39): E2254 Die überladene Prozedur 'Read' muss mit der Direktive 'overload' gekennzeichnet sein

[dcc32 Fehler] Unit23.pas(39): E2252 Es gibt bereits eine Methode 'Read' mit identischen Parametern
Nur bei der RTTI müsste man sich was überlegen, wie man das macht.
Und auch die IS/AS-Prüfungen, und Ähnliches, würden etwas aufwändiger, da man dann ja keine lineare Vererbung mehr hat, sondern einen Baum.


Aber nein, es ist dennoch nicht möglich, in Delphi eine Mehrfachvererbung hinzubekommen.
(jedenfalls nicht so, daß man die Typen, so wie es jetzt möglich ist, einfach so blind in die neuen Vererbungslinien casten kann)
In dynamischen Sprachen, welche paktisch alles zur Laufzeit parsen und nicht mit festen Indize/Adressen arbeiten, wie z.B. Java/PHP/JavaScript, ist das halt was Anderes.

Klasse/Interface 1
* Addresse 1 = Funktion A
* Addresse 2 = Funktion B

Klasse/Interface 2
* Addresse 1 = Funktion C
* Addresse 2 = Funktion D

Klasse/Interface 1+2
* Addresse 1 = Funktion A oder Funktion C
* Addresse 2 = Funktion B oder Funktion D

(das Selbe nochmal für alle Felder/Variablen in der Klasse usw.)


Wenn man jetzt auf Adresse 1 zugreift, bei wem soll man denn nun rauskommen?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (17. Jul 2014 um 19:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#9
  Alt 17. Jul 2014, 19:23
Du könntest die Hierarchie auch auf den Kopf stellen:
Dein Messgerät hat allgemeine Schnittstelle (IMessgerät), welche zusätzliche Sichten auf Messgerät (also die anderen Interfaces) erzeugen kann. Vererbung gibt es unter den Interfaces keine. Die Klassen, welche IMessgerätLivedatenfähig (und so weiter) bereitstellen, müssen dabei noch nicht einmal mit TFluxKompensator verwandt sein, sondern werden vielleicht nur von der TFluxKompensator-Instanz zur Laufzeit erstellt und konfiguriert.

Aber nein, es ist dennoch nicht möglich, in Delphi eine Mehrfachvererbung hinzubekommen.
In dynamischen Sprachen, welche paktisch alles zur Laufzeit parsen und nicht mit festen Indize/Adressen arbeiten, wie z.B. Java/PHP/JavaScript, ist das halt was Anderes.
Du weißt schon, das C++ Mehrfachvererbung anbietet, sicher keine dynamische Sprache ist und man dort trotzdem den meisten Probleme bei der Mehrfachvererbung relativ intuitiv umgehen kann

Eigentlich sollte es mit "Mehrfachvererbung" von Interfaces überhaupt kein Problem geben, eben weil nur eine Schnittstellenbeschreibung ohne Implementierung ist.

Geändert von TBx (18. Jul 2014 um 08:28 Uhr) Grund: Doppelpost aufgelöst
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Fehlende Mehrfachvererbung bei Schnittstellen

  Alt 17. Jul 2014, 19:38
Auch für Delphi ist das "möglich", aber man muß da etwas aufpassen und in den zweiten, dritten und x-ten Vererbungslinien, neben der Hauptvererbungslinie, sind bestimmte Dinge nicht mehr möglich.

In dem neuen kombinierten Typen ist dann (intern) nur die erste Vererbungslinie wirklich vererbt und alle anderen Felder/Funktion sind praktisch in den neuen Typen reinkopiert. (so wie bei den Generics)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      

 

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 05:33 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