Vererbung Superklasse -> Subklasse

martinho

Mitglied
Hallo zusammen,

ich habe eine Frage welche Implementierung eleganter ist.

Und zwar habe ich grundsätzlich eine Superklasse die mehrere Attribute und eine Methode hat. Von dieser Superklasse leite ich mehrere Subklassen ab wobei zu den Attributen noch welche hinzugefügt werden, die Methode wird für jede Subklasse angepasst. Da das Programm eigentlich nur mit String arbeitet habe ich eine Klasse mit Definitionen erstellt damit man einen schnellen überblick erhält.

Definitionen (Auszug):

Code:
// Steckdosen
    public final static String sd_typ = "Switch";
    public final static String sd_name = "sd";
    public final static String sd_namehome = "sdhome";
    public final static String sd_name2 = "onOff";
    public final static String sd_label = "Steckdose";
    public final static String sd_labelhome = "Steckdose Homematic";
    public final static String sd_mapping = "";
    public final static String sd_channel = "nutzerwelten:sd:a651b2fa";
    public final static String sd_channel2 = "onOff";
    public final static String sd_channel2home = "homematic:HM-ES-PMSw1-Pl:4c27bc95:NEQ0386523:1#STATE";
    public final static String sd_dateiname = "NW_Steckdosen.items";

Nun ist die Frage ob ich die Attribute die ich der Subklasse hinzufüge noch in den Konstruktor packe.... z.B.

Code:
private String labelhome;
    private String channel2home;
    private String namehome;
    private int homeAnzahl;
  
    public Steckdosen(int Anzahl, int homeAnzahl) {
        super(sd_typ, sd_name, sd_name2, sd_label, sd_mapping, sd_channel, sd_channel2, Anzahl, sd_dateiname);
        this.labelhome=sd_labelhome;
        this.channel2home=sd_channel2home;
        this.namehome=sd_namehome;
        this.homeAnzahl=homeAnzahl;
    }

Oder in der Subklasse direkt die "sd_"-Attribute nutze ohne diese im Konstruktor anderen Variablen zuzuweisen. In der Methode selbst könnte ich ja einfach die in der Definitionen erstellen Variablen nutzen. Was ist hier eleganter? Wenn ich die Attribute nicht im Konstruktor erwähne gehören sie sozusagen auch nicht zum dem jeweiligen Objekt sehe ich das richtig?

Danke im voraus

Martin
 

mrBrown

Super-Moderator
Mitarbeiter
Im Idealfall setzt du alle Attribute der Oberklasse im Konstruktiv der Oberklasse, übergibst sie diesem also im Konstruktor der Unterklassen.
Der jeweilige Konstruktor setzt direkt also nur die in der eigenen Klasse deklarieren Attribute.

Oder in der Subklasse direkt die "sd_"-Attribute nutze ohne diese im Konstruktor anderen Variablen zuzuweisen. In der Methode selbst könnte ich ja einfach die in der Definitionen erstellen Variablen nutzen. Was ist hier eleganter? Wenn ich die Attribute nicht im Konstruktor erwähne gehören sie sozusagen auch nicht zum dem jeweiligen Objekt sehe ich das richtig?
Was du hiermit meinst, erschließt sich mir allerdings nicht.


Da das Programm eigentlich nur mit String arbeitet habe ich eine Klasse mit Definitionen erstellt damit man einen schnellen überblick erhält.
Das ist btw durchaus Verbesserungswürdig ;)
 

martinho

Mitglied
Im Idealfall setzt du alle Attribute der Oberklasse im Konstruktiv der Oberklasse, übergibst sie diesem also im Konstruktor der Unterklassen.
Der jeweilige Konstruktor setzt direkt also nur die in der eigenen Klasse deklarieren Attribute.

Das wären aber ziemliche viele Attribute. Ich habe die Oberklasse nur mit den Attributen ausgestattet die jede Unterklasse hat, und die Unterklassen dann mit weiteren Attributen die wirklich nur für diese Unterklasse ist hinzugefügt.

Was du hiermit meinst, erschließt sich mir allerdings nicht.

Ich kann ja die Definitionen also die Attribute die ich in der "Definitionen"-Klasse erstellt habe einfach durch import in die Subklasse integrieren und könnte die dann einfach verwenden. Ihnen etwas in den Konstruktor zu schreiben.

Das ist btw durchaus Verbesserungswürdig ;)

Was wäre denn hier besser?

Die ganzen Strings sind dafür da diese dann später in richtiger Reihenfolge in Textdateien zu schreiben:

Code:
public void functAusgabe() {
      
        PrintWriter pWriter = null;

try {
  
    pWriter = new PrintWriter(new BufferedWriter(new FileWriter(dateiname)));
  
    
        pWriter.println("// Items");
        pWriter.println();
      
        int x=0;
      
        for (int i=1 ; i<=Anzahl ; i++){
          
            pWriter.println(itemTyp+" "+itemName+i+"_"+itemName2+" "+"\""+labelText+" "+itemName+i+" "+mapping+"\""+" "+"{channel="+"\""+channel+":"+itemName+i+":"+channel2+"\""+"}");
            x=x+1;
          
        }
      
} catch (IOException ioe) {
  
} finally {
    if (pWriter != null){
        pWriter.flush();
        pWriter.close();
    }
}
    }

Das wäre die Methode in der Oberklasse. Die Methode in einer Unterklasse sieht was anders aus:

Code:
@Override
    public void functAusgabe() {

        super.functAusgabe();

        try (PrintWriter pw = new PrintWriter(new FileOutputStream(new File(nk_dateiname), true /* append = true */))) {

            pw.println("");
            pw.println("// Alive Items");

            int x = 0;

            for (int i = 1; i <= Anzahl; i++) {

                pw.println(typ2 + " " + itemName + i + "_" + alive + " " + "\"" + alabel + " " + itemName + i + " " + amapping + "\"" + " " + "{channel=" + "\"" + channel + ":" + itemName + i + ":" + alive + "\"" + "}");
                x = x + 1;

            }

            pw.println("");
            pw.println("// ButtonAlert Items");

            x = 0;

            for (int i = 1; i <= Anzahl; i++) {

                pw.println(typ2 + " " + itemName + i + "_" + buttonalert + " " + "\"" + balertlabel + " " + itemName + i + " " + alertmapping + "\"" + " " + "{channel=" + "\"" + channel + ":" + itemName + i + ":" + buttonalert + "\"" + "}");
                x = x + 1;

            }

            pw.println("");
            pw.println("// AlertReset Items");

            x = 0;

            for (int i = 1; i <= Anzahl; i++) {

                pw.println(typ3 + " " + itemName + i + "_" + alertreset + " " + "\"" + alertresetlabel + " " + itemName + i + " " + "\"" + " " + "{channel=" + "\"" + channel + ":" + itemName + i + ":" + alertreset + "\"" + "}");
                x = x + 1;

            }

            pw.println("");
            pw.println("// AlertImpulse Items");

            x = 0;

            for (int i = 1; i <= Anzahl; i++) {

                pw.println(typ2 + " " + itemName + i + "_" + alertimpulse + " " + "\"" + aimpulselabel + " " + itemName + i + " " + "\"" + " " + "{channel=" + "\"" + channel + ":" + itemName + i + ":" + alertimpulse + "\"" + "}");
                x = x + 1;

            }

            pw.println("");
            pw.println("// Extra Items");

            x = 0;

            for (int i = 1; i <= Anzahl; i++) {

                pw.println(typ2 + " " + itemName + i + "_" + fallWarn + " " + "\"" + fallWarnlabel + " " + itemName + i + " " + alertmapping + "\"");
                pw.println(typ2 + " " + itemName + i + "_" + fallDetect + " " + "\"" + fallDetectlabel + " " + itemName + i + " " + alertmapping + "\"");
                pw.println(itemTyp + " " + itemName + i + "_" + buttonAlertPersist + " " + "\"" + buttonAlertPersistlabel + " " + itemName + i + "\"");
                pw.println(itemTyp + " " + itemName + i + "_" + chart + " " + "\"" + chartlabel + " " + itemName + i + "\"");
                pw.println("");
                x = x + 1;

            }

        } catch (FileNotFoundException ex) {
            Logger.getLogger(Kontakte.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}
 

mrBrown

Super-Moderator
Mitarbeiter
Das wären aber ziemliche viele Attribute. Ich habe die Oberklasse nur mit den Attributen ausgestattet die jede Unterklasse hat, und die Unterklassen dann mit weiteren Attributen die wirklich nur für diese Unterklasse ist hinzugefügt.
Zu viele Attribute ist dann Zeichen für schlechtes Design, aber kein Grund, den Konstruktor nicht zu nutzen ;)

Ich kann ja die Definitionen also die Attribute die ich in der "Definitionen"-Klasse erstellt habe einfach durch import in die Subklasse integrieren und könnte die dann einfach verwenden. Ihnen etwas in den Konstruktor zu schreiben.
Redest du über statische Konstanten oder Attribute des Objekts?
Erstere kannst du natürlich überall nutzen - solltest du aber nur lesend und nicht schreibend.

Was wäre denn hier besser?
Passende Klassen/Enums - kommt halt immer drauf an.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Wie greife ich in der Subklasse auf die Parameter einer Methode der Superklasse zu ? Java Basics - Anfänger-Themen 15
N Mit Objekt der Superklasse auf Methode der Subklasse zugreifen Java Basics - Anfänger-Themen 6
V Vererbung Subklasse soll Superklasse verändern Java Basics - Anfänger-Themen 2
D Instanz einer Subklasse anhand deren Superklasse Java Basics - Anfänger-Themen 5
A Array in Subklasse - Werte aus Superklasse Java Basics - Anfänger-Themen 4
R Vererbung Übergabe von Variablen der Superklasse an Subklasse mit "extends" Java Basics - Anfänger-Themen 5
J Subklasse soll alle Klassen/Pakete der Superklasse importieren Java Basics - Anfänger-Themen 3
moini Auf Array aus Superklasse zugreifen? Java Basics - Anfänger-Themen 2
C Initialiseren einer Superklasse Java Basics - Anfänger-Themen 2
Kirby.exe Methode aus Superklasse benutzen Java Basics - Anfänger-Themen 18
F Java - Superklasse BUG Java Basics - Anfänger-Themen 1
D Compiler-Fehler Konstruktor von Superklasse übernehmen Java Basics - Anfänger-Themen 1
P auf superklasse zugreifen Java Basics - Anfänger-Themen 24
C Superklasse und Klassen ausgeben Java Basics - Anfänger-Themen 7
J Vererbung Variablen aus Superklasse übernehmen Java Basics - Anfänger-Themen 2
gamebreiti Problem mit Setter in Superklasse Verkettung der Kostruktoren??? Java Basics - Anfänger-Themen 7
F Superklasse nochmals erzeugen? Java Basics - Anfänger-Themen 7
A Vererbung Wie auf Variablen der Superklasse zugreifen? Java Basics - Anfänger-Themen 10
M Vererben von Superklasse ohne Konstruktor Java Basics - Anfänger-Themen 9
G Auf einen bestimmten Konstruktor in der abstrakten Superklasse zugreifen? Java Basics - Anfänger-Themen 2
W Superklasse Konstruktor Java Basics - Anfänger-Themen 9
K Methodenvererbung durch eine Superklasse Java Basics - Anfänger-Themen 7
M OOP Klasse mit Superklasse instanzieren Java Basics - Anfänger-Themen 3
D Klassen Problem - Übergabe an Konstruktor von Superklasse Java Basics - Anfänger-Themen 2
E Der Konstruktor der Superklasse Java Basics - Anfänger-Themen 8
K Polymorphie Objektreferenz als Superklasse anstatt des Objekttypes Java Basics - Anfänger-Themen 12
capgeti Datentypen Static methoden aus Superklasse mit Generics definieren? Java Basics - Anfänger-Themen 9
G Vererbung mit einer Instanz aus der Superklasse Java Basics - Anfänger-Themen 2
G Zugriff auf Superklasse Java Basics - Anfänger-Themen 13
N Zugriff auf Vaiablen inhalte der superklasse Java Basics - Anfänger-Themen 7
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
H Subklasse Java Basics - Anfänger-Themen 1
E gleicher Name in der Basisklasse und in der Subklasse Java Basics - Anfänger-Themen 45
L Auf Methoden einer Subklasse zugreifen ohne Typecast ? Java Basics - Anfänger-Themen 6
S Exklusive Methoden einer Subklasse Java Basics - Anfänger-Themen 6
L Subklasse von ArrayList nur mit bestimmten Objekten füllen Java Basics - Anfänger-Themen 1
V Frage zu Polymorphismus: Objekt der Subklasse in Referenz der Oberklasse Java Basics - Anfänger-Themen 4
I Bm3nrc - Zugriff auf Methoden in Subklasse Java Basics - Anfänger-Themen 6
L Private Methode in Subklasse? Java Basics - Anfänger-Themen 2
D OOP Funktion in Subklasse aufrufen Java Basics - Anfänger-Themen 10
maddin86 Fehler auswerfen in Konstruktor in Subklasse Java Basics - Anfänger-Themen 5
S Festlegen, dass Subklasse nicht erlaubt ist? Java Basics - Anfänger-Themen 3
S Zugriff auf Methode einer Subklasse Java Basics - Anfänger-Themen 9
B Wie greife ich auf die Funktion der Subklasse zu? Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben