Ebenso sollte man sich immer überlegen, was man an Methoden braucht. Für vieles gibt es keine Getter und Setter. Du kannst ein Auto beladen und dazu dann halt den Gegenstand und Ort angeben. Also z.B. sowas wie auto.belade(sonnenbrille, HANDSCHUHFACH)
aber du machst nie ein handschuhfach = new Handschuhfach(); handschuhfach.insert(Sonnenbrille); auto.setHandschuhfach(handschuhfach);
, denn Handschuhfach ist ja ein Implementierungsdetail vom Auto. Das kennst Du nicht. Das ist ein Implementierungsdetail, das der Hersteller kapselt.
Das würde ich noch mal unterstreichen. Ich verstehe, dass man am Anfang sehr viel Daten & Technikgetrieben ist (Ich hab ein Attribut X, auf das andere "zugreifen" sollen bzw. es bearbeiten können.
Aber in Wirklichkeit hast du in der Klasse kein Attribut X, sondern du hast eine Fachlichkeit, die die Klasse abbildet - und diese Fachlichkeit benötigt als Implementierungsdetail vielleicht ein Attribut X. Deswegen ist ein sinnvolles Vorgehen sich folgende Fragen zu stellen
* Was ist die Aufgabe meiner Klasse? Was macht meine Klasse fachlich? Was ist die Aufgabe von Product, Demo und SubDemo
* Wie soll die Klasse verwendet werden, also welche Methoden soll sie nach außen bereitstellen? Das ist unabhängig davon wie es nachher intern verwaltet wird.
* Und als letzten Schritt - wie implementiere ich die Methoden der Klasse, was für Felder von welchen Typen brauche ich um den Zustand und die Daten zu speichern.
Dann hast du vielleicht Klassen, die dienen hauptsächlich dazu um Daten zu speichern - viele Attribute, hauptsächlich get/set Methoden, wenig fachliche Methoden. Aber daneben gibt es Klassen, die rein fachliche Methoden anbieten und die gar keine get/set Methoden haben - weil du nie Daten direkt änderst, sondern irgendwas durchführen willst.
Um das Beispiel mit dem Auto aufzugreifen. Du hast vielleicht eine Klasse Tank als reine Datenklasse mit Feldern "spritArt", "volumen", "inhalt". Dafür gibt es get-Methoden für alle 3 Attribute und eine set-Methode für den Inhalt.
Und dann hast du eine Klasse Auto. Die hat innen drin ein Feld vom Typ Tank. Aber das wird gar nicht per get/set nach außen freigeben. Sondern es gibt vielleicht eine Methode tanke(int liter, SpritArt) - die dann intern das Feld tank benutzt.