Diamond-Problem - LinkFang.de





Diamond-Problem


Das Diamond-Problem entsteht durch Mehrfachvererbung in der Objektorientierten Programmierung und Wissensmodellierung. Es kann auftreten, wenn eine Klasse D auf zwei verschiedenen Vererbungspfaden (B und C) von ein und derselben Basisklasse A abstammt. Zeichnet man die Vererbungsbeziehungen zwischen den Klassen als Diagramm, so ergibt sich die Form einer Raute (englisch rhombus oder diamond), nach der das Diamond-Problem benannt ist.

Beispiel

Die Probleme der Mehrfachvererbung lassen sich am Beispiel eines Amphibienfahrzeugs verdeutlichen, das sowohl die Eigenschaften eines Land- als auch die eines Wasserfahrzeuges erbt. Das Diamond-Problem tritt hierbei auf, wenn beide von der Klasse Fahrzeug abstammen, die eine Methode des Fortbewegens sowie die Eigenschaften Höchstgeschwindigkeit und Sitzplätze (für Insassen) besitzt. Die Frage ist nun, ob sich ein Amphibienfahrzeug

  1. wie ein Land- oder ein Wasserfahrzeug oder
  2. wie ein Land- und ein Wasserfahrzeug fortbewegt.

Außerdem variiert die Höchstgeschwindigkeit je nach Verwendung, die Anzahl der Sitzplätze aber nicht. Es wäre also sinnvoll, für erstere zwei verschiedene, für letztere aber nur einen Wert zu speichern. Die erste Mehrdeutigkeit kann nur im Einzelfall gelöst werden; so hat ein Amphibienfahrzeug beispielsweise zwei Fortbewegungsarten (-methoden), obwohl Fahrzeug nur eine Fortbewegungsart hat.

Modellierung in C++

In C++ ist es möglich, bei Definition der Klassen B und C anzugeben, ob sie sich eine gemeinsame Instanz der Klasse A teilen sollen (Diamond), oder ob sie jeweils ihre eigene Instanz besitzen sollen (normale Mehrfachvererbung):

Diamond-Vererbung Normale Mehrfachvererbung
class A {
   int a;
};
 
class B: virtual A {
   int b;
};
 
class C: virtual A {
   int c;
};
 
class D: B, C {
   int d;
};
class A {
   int a;
};
 
class B: A {
   int b;
};
 
class C: A {
   int c;
};
 
class D: B, C {
   int d;
};
Speicherlayout:

Die Klassen B und C haben jeweils einen Verweis auf Member der Oberklasse A und haben Zugriff auf ein und dieselbe Variable a der Oberklasse A.

Die Klassen B und C haben jeweils ihre eigenen Kopien der Member der Oberklasse A und damit Zugriff auf zwei unterschiedliche Variablen a.

Vermeidung

Wegen der Probleme, die bei Mehrfachvererbung auftreten können, unterstützen einige objektorientierte Programmiersprachen keine Mehrfachvererbung. Teilweise werden Alternativkonzepte angeboten, wie zum Beispiel die Konstruktion von Zwillingsklassen. Die Programmiersprache Eiffel bietet Konstrukte (renaming) zur transparenten Auflösung der bei Mehrfachvererbung auftretenden Namenskonflikte. Smalltalk und Oberon verbieten Mehrfachvererbung. Java, die .NET-Sprachen oder auch Object Pascal lassen keine Mehrfachvererbung zu, bieten jedoch einen speziellen Typ der abstrakten Klasse an, das Interface, von dem mehrfach geerbt werden kann. Im Unterschied zur Vererbung von Klassen wird hier nur die Deklaration vererbt, nicht die Implementierung der Funktionen und vor allem keine Membervariablen. Ab Java 8 kann ein Interface auch Methoden beinhalten, jedoch können diese keine Membervariablen verwenden.[1] C++ bietet das Konzept der virtuellen Basisklasse, wodurch eine Replikation der Member der Basisklasse in der abgeleiteten Klasse vermieden wird. PHP benutzt unter dem Begriff „horizontal reuse“ (Horizontale Wiederverwendung) ab der Version 5.4 sogenannte Traits, welche lose Klassenfragmente sind und in andere Klassen eingebunden werden können.[2][3]

Literatur

  • Eddy Truyen, Wouter Joosen, Bo Jørgensen, Petrus Verbaeten: A Generalization and Solution to the Common Ancestor Dilemma Problem in Delegation-Based Object Systems. In: Proceedings of the 2004 Dynamic Aspects Workshop. 2004, S. 103-119.

Einzelnachweise

  1. docs.oracle.com
  2. stefan-marr.de
  3. wiki.php.net

Kategorien: Objektorientierte Programmierung

Quelle: Wikipedia - http://de.wikipedia.org/wiki/Diamond-Problem (Vollständige Liste der Autoren des Textes [Versionsgeschichte])    Lizenz: CC-by-sa-3.0

Änderungen: Alle Bilder mit den meisten Bildunterschriften wurden entfernt. Ebenso alle zu nicht-existierenden Artikeln/Kategorien gehenden internen Wikipedia-Links (Bsp. Portal-Links, Redlinks, Bearbeiten-Links). Entfernung von Navigationsframes, Geo & Normdaten, Mediadateien, gesprochene Versionen, z.T. ID&Class-Namen, Style von Div-Containern, Metadaten, Vorlagen, wie lesenwerte Artikel. Ansonsten sind keine Inhaltsänderungen vorgenommen worden. Weiterhin kann es durch die maschinelle Bearbeitung des Inhalts zu Fehlern gerade in der Darstellung kommen. Darum würden wir jeden Besucher unserer Seite darum bitten uns diese Fehler über den Support mittels einer Nachricht mit Link zu melden. Vielen Dank!

Stand der Informationen: August 201& - Wichtiger Hinweis: Da die Inhalte maschinell von Wikipedia übernommen wurden, ist eine manuelle Überprüfung nicht möglich. Somit garantiert LinkFang.de nicht die Richtigkeit und Aktualität der übernommenen Inhalte. Sollten die Informationen mittlerweile fehlerhaft sein, bitten wir Sie darum uns per Support oder E-Mail zu kontaktieren. Wir werden uns dann innerhalb von spätestens 10 Tagen um Ihr Anliegen kümmern. Auch ohne Anliegen erfolgt mindestens alle drei Monate ein Update der gesamten Inhalte.