Informatik > Lexikon

KENNT-Beziehung

Der Begriff KENNT-Beziehung ist in der Literatur umstritten. Oft werden KENNT-Beziehungen mit HAT-Beziehungen verwechselt oder durcheinandergebracht. Hier möchte ich eine eher technische Unterscheidung der beiden Assoziationen (Beziehungen) vorstellen.

HAT-Beziehungen

Die Objekte der anderen Klasse werden in der übergeordneten Klasse direkt erzeugt. Das heißt, die erzeugten Objekte sind ohne die übergeordnete Klasse gar nicht vorhanden.

Beispiel:
		public class Held
		{
			Gegenstand schwert;
			
			public Held()
			{
				schwert = new Gegenstand("Excalibur");
			}
		}

Das Objekt schwert der Klasse Gegenstand wird im Konstruktor der Klasse Held erzeugt. Natürlich können auch außerhalb der Klasse Held Objekte der Klasse Gegenstand erzeugt werden. Die Formulierung "Objekte der Klasse Gegenstand können für sich alleine nicht existieren" ist also nicht korrekt.

Oft wird das Golfplatz-Beispiel als Musterbeispiel für eine HAT-Beziehung aufgeführt: Ein Golfplatz HAT Löcher, aber die Löcher können nicht ohne den Golfplatz existieren. Das ist aber eine falsche Sichtweise, selbstverständlich könnte auch eine Klasse wie Auto oder Held ein Objekt der Klasse Loch anlegen. Ich finde die eher technische Definition besser, nach der eine HAT-Beziehung besteht, wenn die Objekte der untergeordneten Klasse in der übergeordneten Klasse erzeugt werden.

KENNT-Beziehungen

Bei einer KENNT-Beziehung existieren die untergeordneten Objekte bereits, wenn die übergeordnete Klasse sie kennenlernt.

Beispiel 1:
		public class Held
		{
			Gegenstand waffe, schild;
			
			public Held(Gegenstand w, Gegenstand s)
			{
				waffe = w;
				schild = s;
			}
		}

Wenn ein neuer Held erzeugt wird, könnte das dann so aussehen:

		public class Spiel
		{
			Held kurt;
				
			public Spiel()
			{
				Gegenstand g1, g2;
				g1 = new Gegenstand("Excalibur");
				g2 = new Gegenstand("Wachsames Auge");
				kurt = new Held(g1,g2);
			}
		}

Zwischen der Klasse Held und der Klasse Gegenstand besteht eine KENNT-Beziehung. Die Klasse Held KENNT Objekte der Klasse Gegenstand. Leicht ist man hier versucht zu sagen, die Klasse Held HAT Objekte der Klasse Gegenstand. Der Unterschied zwischen HAT und KENNT ist ja auch wirklich nicht sehr groß.

Zwischen der Klasse Spiel und der Klasse Held besteht tatsächlich eine HAT-Beziehung, denn der Held kurt wird in der Klasse Spiel erzeugt. Aber welche Beziehung besteht zwischen Spiel und Gegenstand? Die beiden Objekte der Klasse Gegenstand werden zwar im Konstruktor von Spiel erzeugt, dann aber an das Objekt kurt der Klasse Held übergeben. Nach Beenden des Konstruktors existieren g1 und g2 nicht mehr, also kann man nicht sagen, dass Spiel-Objekte Gegenstand-Objekte HABEN.

UML-Diagramm mit den Klassen Spiel, Held und Gegenstand

Hier das Ganze noch einmal graphisch dargestellt als UML-Klassendiagramm. Objekte der Klasse Spiel ERZEUGEN ein Objekt der Klasse Held, Objekte der Klasse Held KENNEN Objekte der Klasse Gegenstand nicht nur, sondern HABEN sie auch. Wie gesagt, die Unterscheidung ist hier nicht leicht.

Beispiel 2:

Ich möchte jetzt mal versuchen, ein Beispiel zu konstruieren, das tatsächlich eine reine KENNT-Beziehung ist.

		public class Gutachter
		{
			
			public int gibWert(Gegenstand g)
			{
				return g.goldwert;
			}
		}

Das ist nun wirklich ein konstruiertes Beispiel. Der Methode gibWert der Klasse Gutachter wird ein Objekt g der Klasse Gegenstand als Parameter übergeben, damit hier der Goldwert des Gegenstandes ausgelesen und als Wert der sondierenden Methode zurückgegeben werden kann. Ist das jetzt eine reine KENNT-Beziehung? Auf jeden Fall ist es keine HAT-Beziehung, denn Objekte der Klasse Gutachter HABEN keine Objekte der Klasse Gegenstand, geschweige denn erzeugen sie solche Objekte.