next up previous contents index
Next: Einfacherbung gegen Mehrfacherbung Up: Interfaces Previous: Interfaces

Beispiel einer Interface-Anwendung

Aufgabe: Objekten von benutzerdefinierten Klassen sollen ein oder mehrere benannte Attribute zugeordnet werden.

z.B.

     ("Farbe", #ff00ff)
     ("transparent", false)

Zunächst: Der Typ Attr

public class Attr
{ private String name;
  private Object value;
  public Attr(String name)
  { this.name = name;
  }
  public Attr(String name, Object value)
  { this.name = name;
    this.value = value;
  }
  public String nameOf()
  { return name;
  }
  public Object valueOf()
  { return value;
  }
  public Object valueOf(Object newValue)
  { Object oldValue = value;
    value = newValue;
    return oldValue;
  }
}

Idee:

Ein Typ Attributed mit folgender Funktionalität:

   void add(Attr newAttr)
   Attr find(String AttrName)
   Attr remove(String AttrName)

Benutzertypen könnten diesen Typ Attributed erweitern und wären somit attributiert:

   class Figure extends Attributed
   { ...
   }

Problem: Einfacherbung in Java verbietet dies im Normalfall, da der Benutzertyp bereits eine Oberklasse hat.

Einziger Ausweg: Einbau der gewünschten Funktionalität in die Wurzelklasse Object. Geht nicht und ist auch nicht sinnvoll!

Lösung mit Interfaces:  

   public interface Attributed
   { void add(Attr newAttr);
     Attr find(String attrName);
     Attr remove(String attrName);
   }

   class AttributedFigure extends WhatEver
     implements Attributed
   { ...
   }

Wir haben eine klare und einfache Lösung unseres Problems, können allerdings die Implementierung von Attributed nicht erben, sondern müssen sie selbst liefern.

zum Beispiel so:

import java.util.*;

public class AttributedImpl
   implements Attributed
{ protected Hashtable attrTable 
     = new Hashtable();

  public void add(Attr newAttr)
  { attrTable.put(newAttr.nameOf(), newAttr);
  }
  public Attr find(String name)
  { return (Attr) attrTable.get(name);
  }
  public Attr remove(String name)
  { return (Attr) attrTable.remove(name);
  }
}


next up previous contents index
Next: Einfacherbung gegen Mehrfacherbung Up: Interfaces Previous: Interfaces

Peter Pfahler, 1997