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!
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); } }