Entgegen der landläufigen Meinung, dass interfaces
in C Sharp vor dem Diamand-Problem schützen, reimplementiert das folgende Beispiellisting das Diamant-Problem, ohne dass C Sharp einen Hinweis auf ein mögliches Problem liefert. Der Quelltext kompiliert in Visual Studio ohne eine Warnung durch.
using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; namespace DiamondTest { enum DiamondValue { Class_A_Value, Class_C_Value } class DiamondData { public DiamondValue Value; } interface IDiamond { DiamondData DiamondData { get; } } class A : IDiamond { DiamondData _diamondData; int _aData; public A() { _diamondData = new DiamondData(); _diamondData.Value = DiamondValue.Class_A_Value; } public DiamondData DiamondData { get { return _diamondData; } } } class B : A { int _neverUsed; public B() { _neverUsed = 0; } } /* C soll IDiamond implementieren, dabei wird - wie bei der * Mehrfachvererbung übersehen, dass eine andere Basisklasse * - nämlich B - bereits mit einer Diamondimplementierung * daherkommt. */ class C : B, IDiamond { /* kein new, kein override, kein Hinweis */ DiamondData _diamondData; public C() { _diamondData = new DiamondData(); _diamondData.Value = DiamondValue.Class_C_Value; } /* kein new, kein override, kein Hinweis */ public DiamondData DiamondData { get { return _diamondData; } } } class Program { static void CompareDiamondDataValue(A a, C c) { MessageBox.Show("DiamondData Identisch?: " + (a.DiamondData.Value == c.DiamondData.Value).ToString()); } static void Main(string[] args) { C c = new C(); /* Ich vergleiche zweimal das gleiche Objekt */ CompareDiamondDataValue(c, c); } } }
Der entscheidene Punkt ist, dass bei
static void CompareDiamondDataValue(A a, C c) { MessageBox.Show("DiamondData Identisch?: " + (a.DiamondData.Value == c.DiamondData.Value).ToString()); }
für a und c das identische Objekt verwendet wird, aber a.DiamondData.Value eben nicht gleich mit c.DiamondData.Value ist, weil auf unterschiedliche Speicherbereiche zugegriffen wird, was für den Entwickler so aber nicht ersichtlich ist.