Navigation überspringen

Generalisierung vs. Spezialisierung

Benötigtes Vorwissen

Generalisierung und Spezialisierung bedingen einander. Je nach Betrachtungsrichtung spricht man von einer Generalisierung oder von einer Spezialisierung. Im allgemeinen Sprachgebrauch wird häufig das Pseudonym "Vererbung" verwendet. Generalisierungen drücken eine Weitergabe von Merkmalen und Fähigkeiten aus, die innerhalb einer Objektgruppe als kleinstes Gemeinsames betrachtet werden kann.

Beispiel:

Wir nehmen eine Objektgruppe Handwerker als abgegrenzt gegenüber anderen an.

Diese Objektgruppe würde sich in einer einzigen Klasse sehr weitverzweigen, da Handwerker über doch sehr unterschiedliche Merkmale und Fähigkeiten verfügen. Dennoch haben alle Handwerker vieles gemeinsam. Diesen wiedersprüchlichen Aussagen begegnet man mit der Generalisierung. In einem ersten Schritt isoliert man alle Gemeinsamkeiten einer großen Objektgruppe. Dieser Vorgang wird mit Generalisierung beschrieben. All die so definierten Merkmale und Fähigkeiten werden in einer Klasse nämlich der Mutterklasse zusammengefasst. Handwerker sind beispielsweise alles Menschen. Menschen kennzeichnen Körpergröße, Geburtsdatum, Geburtsort, laufen(), sprechen() usw. Diese Merkmale und Fähigkeiten sind allen Handwerkern gemein. Die Mutterklasse "Mensch" bildet die Superklasse für die speziellen Handwerker(-unter)gruppen.

Ausgehend von der Mutterklasse "Mensch" lassen sich nun Tochterklassen z.B. Tischler, Maurer etc. ableiten. In diesen Tochterklassen werden spezielle Merkmale und Fähigkeiten definiert, die typisch für die jeweiligen Handwerker sind. Dieser Vorgang wird Spezialisierung genannt.

Im Klassendiagramm fassen wir das zusammen und es folgt:

Dabei ist zu beachten:

  • Pfeilspitzen zeigen immer auf die Generalisierungen, nicht in Richtung der Spezialisierung.
  • Generalisierung Pfeile vereinigen sich zu gemeinsamen Pfeilen, da sie sich auf eine Mutterklasse beziehen.

Umsetzung in Java

Generalisierung bzw. Spezialisierungen werden in Java durch das "Erweitern" einer Klasse vollzogen. Eine solche Erweiterung kann pro Klasse ein einziges Mal erfolgen.

Beispiel: Maurer aus dem oben gezeigten Bild

package test;
/**
 * @author T.Smit
 */
public class MenschVSHandwerker {

    public static void main(String[] args) {
        
        Maurer maurer1 = new Maurer();
        maurer1.setName("Max Müller");
        maurer1.setAkkord(true);
        maurer1.setGeburtsDatum("01.01.2001");
        maurer1.setGroesse(185.5);
        System.out.println("Der Maurer heißt: " + maurer1.getName());

    }//public static void main(String[] args)

}//public class MenschVSHandwerker

class Mensch {

    private String name;
    private String geburtsDatum;
    private double groesse;

    //all setter
    public void setName(String n) {
        this.name = n;
    }//public void setName(String n)

    public void setGeburtsDatum(String gd) {
        this.geburtsDatum = gd;
    }//public void setGeburtsDatum(String gd)

    public void setGroesse(double g) {
        this.groesse = g;
    }

    //all getter
    public String getName() {
        return this.name;
    }//public String getName()

    public String getGeburtsDatum() {
        return this.geburtsDatum;
    }//public String getGeburtsDatum()

    public double getGroesse() {
        return this.groesse;
    }//public double getGroesse()

}//class Mensch

class Maurer extends Mensch {

    private boolean akkordTaetigkeit = false;
    private boolean staplerScheinVorhanden = false;
    private boolean handWerkzeugScheinVorhanden = false;

    //all setter
    public void setAkkord(boolean ba) {
        this.akkordTaetigkeit = ba;
    }//public void setAkkord(boolean ba)

    public void setStaplerSchein(boolean a) {
        this.staplerScheinVorhanden = a;
    }//public void setStaplerSchein(boolean a)

    public void setHandWerkzeugSchein(boolean hw) {
        this.handWerkzeugScheinVorhanden = hw;
    }//public void setHandWerkzeugSchein(boolean hw)

    //all getter
    public boolean getAkkord() {
        return this.akkordTaetigkeit;
    }//public boolean getAkkord()

    public boolean getStaplerSchein() {
        return this.staplerScheinVorhanden;
    }//public boolean getStaplerSchein()

    public boolean getHandWerkzeugSchein() {
        return this.handWerkzeugScheinVorhanden;
    }//public boolean getHandWerkzeugSchein()

}//class Handwerker extends Mensch