Informatik > Lexikon

HAT-Beziehung

HAT-Beziehungen gehören zu den gerichteten Beziehungen. Von einer gerichteten Beziehung kann man sprechen, wenn ein Objekt über eine Referenz  (einen Zeiger oder pointer) Zugriff auf ein oder mehere Objekte einer anderen Klasse hat.

Beispiel

Betrachten wir die Klasse Held aus dem Adventure-Exkurs näher:

public class Held
{
    private String name;
    private double leben;
    private Gegenstand waffe, schild, ruestung;
    
    public Held(String name)
    {
      this.name = name;
      leben = 100;
      waffe = null;
      schild = null;
      ruestung = null;
    }

Wir sehen hier die Attribute und den Konstruktor der Klasse Held. Der Name des Helden ist ein normaler String, die Lebenspunkte werden als double-Zahl verwaltet. Kommen wir nun zu den nächsten drei Attributen. Der Held soll eine Waffe, einen Schild und eine Rüstung haben. Diese drei Attribute sind weder Zahlen noch Strings, sondern Objekte der Klasse Gegenstand.

Ein Objekt der Klasse Held HAT also drei Objekte der Klasse Gegenstand. Man spricht hier von HAT-Beziehungen zwischen den Objekten; verallgemeinernd redet man oft auch von HAT-Beziehungen zwischen den entsprechenden Klassen.

In UML-Diagrammen wird eine solche HAT-Beziehung durch einen Pfeil zwischen den beiden Klassen angedeutet, der eine rautenförmige Spitze hat, die auf die besitzende Klasse zeigt. Zwischen den Klassen Held und Gegenstand sieht diese HAT-Beziehung so aus:

Die kleine Ziffer 3 am Anfang des Pfeiles deutet an, dass die Held-Objekte je drei Gegenstand-Objekte haben.

HAT-Beziehungen ermöglichen die Erzeugung von Objekten anderer Klassen sowie die Benutzung der Methoden anderer Klassen innerhalb eines Objektes. Schauen wir uns das an einem ganz typischen Anwendungsbeispiel an. Angenommen, jeder Held, egal wie er heißt, soll von Anfang an einen Schild namens "Orkwehr" mit einem Verteidigungswert von 10 und einem Goldwert von 100 besitzen. Dann können wir in den Konstruktor des Helden schreiben:

public Held(String name) 
{ 
   this.name = name; 
   leben = 100; 
   schild = new Gegenstand(2,"Orkwehr",0,10,100); 
}

Wir haben jetzt im Konstruktor der Klasse Held auf den Konstruktor der Klasse Gegenstand zugegriffen. Auf ähnliche Weise können wir in der Methode anzeigen des Helden auf die anzeigen-Methode des Gegenstandes zurückgreifen:

public void anzeigen(Graphics g, int x, int y)
{
   g.drawString("Der Held heißt " + name,x,y);
   g.drawString("Er hat " + (int)leben + " Lebenspunkte,x,y+20);
   g.drawString("Er hat folgenden Schild: ",x,y+40);
   schild.anzeigen(g,x,y+60);
}

HAT-Beziehungen / KENNT-Beziehungen

Eigentlich muss man zwischen zwei verschiedenen Formen der HAT-Beziehung unterscheiden. In unserem Beispiel können Objekte der Klasse Gegenstand existieren, ohne dass sie in ein Objekt der Klasse Held eingebettet sind. Sie können quasi für sich alleine vorkommen. Eine solche HAT-Beziehung nennt man auch Assoziation oder KENNT-Beziehung. Eine KENNT-Beziehung verknüpft zwei voneinander (relativ) unabhängige Klassen.

Es gibt aber auch Klassen, deren Objekte ausschließlich als Bestandteile anderer Objekte vorkommen; alleine kommen sie nicht vor. Hier würde man dann von einer Komposition reden. Das übergeordnete, besitzende Objekt enthält dann Objekte, die für sich alleine nicht existieren können. Ein häufig zitiertes Beispiel ist die Klasse Golfplatz, die Objekte der Klasse Loch besitzt. Ein Loch kann aber ohne Golfplatz nicht existieren.

Eine andere Unterscheidung zwischen HAT-Beziehung und KENNT-Beziehung (inf-schule.de) sieht so aus: Bei einer HAT-Beziehung kann die übergeordnete Klasse die Objekte der untergeordneten Klasse selbst erzeugen, bei einer KENNT-Beziehung aber nicht. Ein Objekt der Klasse Held aus dem obigen Beispiel kann Objekte der Klasse Gegenstand erzeugen (mit dem new-Operator), darum handlt es sich hier um eine HAT-Beziehung.

Interne Links:

Externe Links: