Abstrakte Klasse, Konstruktorkette, Attribute setzen

daOrby

Mitglied
Hallo liebe Forengemeinde :D

Derzeit bin ich dabei mir Java beizubringen und bin bei einer Aufgabe auf ein Problem gestoßen bei dem ich ein paar grundlegende Fragen habe.

Es gibt zwei Klassen, eine grundlegende Klasse (Product) ist abstrakt, die andere (Pen) ist eine "normale" Klasse. Darüberhinaus gibt es noch ein Enum, welches die aktuelle Währung (Currency) für das jeweilige Produkt festlegt:

Abstrakte Klasse Product:
Java:
public abstract class Product {
    
    //attributes
    private double price;
    private String name;
    private Currency currency;
    
    //constructor
    Product(double price, String name, Currency currency) {
        this.price = price;
        this.name = name;
        this.currency = currency;
    }
    
    //get-set-methods
    public void setPrice(double price) {
        this.price = price;
    }
    
    //methods
    public abstract void buyProduct();

}

Klasse Pen:
Java:
public class Pen extends Product{
    
    //constructor
    Pen(double price, String name, Currency currency) {
        super (price, name, currency);
        setPrice(1.22);
        
    }
    
    //methods
    public void buyProduct() {
    }

}

Enum Currency:
Java:
public enum Currency {

        EURO, DOLLAR, YEN;
}

Meine Problem: Ich möchte die Attribute für die Produkte möglichst in der abstrakten Klasse Product lassen und mit der Klasse Pen und dem entsprechendem Konstruktor diese Attribute übergeben. Dabei bin ich auf das Problem gestoßen, dass ich diese wegen mangelnder Sichtbarkeit in der Klasse Pen nicht deklarieren und per super() an die abstrakte Klasse Product übergeben kann.

Mit einer set-Methode kann ich das machen, wobei ich mir irgendwie nicht vorstellen kann, dass das besonders sinnvoll ist.
Soll ich diese Attribute direkt in der Kindklasse deklarieren?

Ich frage mich einfach welche Vorgehensweise hier sozusagen üblich und sinnvoll ist.

Ich hoffe mein Problem kommt halbwegs verständlich rüber...
 

Robat

Top Contributor
und per super() an die abstrakte Klasse Product übergeben kann.
Warum?
Java:
    public Pen(double price, String name, Currency currency) {
        super (1.22, name, currency);      
    }

PS: Warum machst du deine Konstruktoren nicht public? Hat das einen besonderen Grund?
PPS: Wenn du die Attribute aus der Oberklasse in der Unterklassen verwenden möchtest, könntest du sie protected setzen.
 

daOrby

Mitglied
Danke für die schnelle Antwort.

Warum? - Meine Idee ist eine grundlegende Klasse für Produkte zu erstellen und bei den Kindklassen (also den eigentlichen Produkten) nur Besonderheiten extra zu deklarieren. Die Attribute will ich aber trotzdem in der Kindklasse mit Werten belegen.

Konstruktoren nicht public - Nein hat keinen bestimmten Grund. Mir fällt spontan auch nicht ein was dagegen sprechen würde.
Protected - Auch ne gute Idee :D. Hatte ich beides jetzt nicht auf dem Schirm.
 

daOrby

Mitglied
Java:
    Pen(double price, String name, Currency currency) {
        super (1.22, "Pen", currency.EURO);
    }

Das hier funktioniert...hatte ich bisher nicht ausprobiert.
 

Robat

Top Contributor
Java:
    Pen(double price, String name, Currency currency) {
        super (1.22, "Pen", currency.EURO);
    }

Das hier funktioniert...hatte ich bisher nicht ausprobiert.
Wenn du das so machst sind die Werte ja fest. Dann musst du sie natürlich auch nicht im Konstruktor übergeben
Java:
Pen() {
    super(1.22, "Pen", currency.EURO);
}
 

temi

Top Contributor
Ich frage mich einfach welche Vorgehensweise hier sozusagen üblich und sinnvoll ist.

Ich glaube nicht, dass man eine generelle Vorgehensweise angeben kann, da es immer davon abhängt, was man erreichten möchte.

Da du in deinem Fall in deinen Unterklassen feste Werte übergeben möchtest, ist das mit dem Konstruktor (Vorschlag #5 von @Robat) sinnvoll.

Weitere Setter sind da nicht notwendig, da sich ja an den Attributen nichts mehr ändert. Insofern wäre es auch nicht so dumm entsprechende Getter-Methoden in der Basisklasse zu definieren und diese dann entweder public oder protected zu machen. Darüber kann die Kindklasse auch auf die Werte lesend zugreifen.
 

daOrby

Mitglied
Ich habs jetzt doch anders gemacht. Die Attribute hab ich protected gesetzt und deklariere sie dann einfach direkt im Konstruktor der Kindklasse. Sieht alles unkomplizierter und übersichtlicher aus :D.

Danke Robat für die schnelle Hilfe :)

Edit: Mir super() wollte er currency.EURO nicht nehmen, deswegen habe ich das jetzt so gemacht.

Java:
public abstract class Product {
   
    //attributes
    protected double price;
    protected String name;
    protected Currency currency;
   
    //constructor
    Product() {
    }
   
    //methods
    public abstract void buyProduct();

}

Java:
public class Pen extends Product {
   
    //constructor
    Pen() {
        this.price = 1.22;
        this.name = "Pen";
        this.currency = currency.EURO;
    }
   
    //methods
    public void buyProduct() {
    }

}
 

Robat

Top Contributor
Sehr schön ist das aber nicht. Stell dir vor du wölltest bei dem Preis noch eine Abfrage auf Gültigkeit machen. So müsstest du die in jeder Kindsklasse einfügen. Das geht schon über den Konstruktor - auch mit dem Enum.
Java:
public abstract class Product {

    //attributes
    protected double price;
    protected String name;
    protected Currency currency;

    //constructor
    protected Product(double price, String name, Currency currency) {
        this.price = price;
        this.name = name;
        this.currency = currency;
    }
    ...
}

public class Pen extends Product {
    public Pen() {
        super(1.22, "PEN", Currency.EURO);
    }
    ....
}
 

daOrby

Mitglied
Weitere Setter sind da nicht notwendig, da sich ja an den Attributen nichts mehr ändert. Insofern wäre es auch nicht so dumm entsprechende Getter-Methoden in der Basisklasse zu definieren und diese dann entweder public oder protected zu machen. Darüber kann die Kindklasse auch auf die Werte lesend zugreifen.

Die Idee gefällt mir. Werde ich so machen. Danke dir.
 

daOrby

Mitglied
Ihr habt Recht. Currency.Euro. Jetzt klappt es auch mit super().

Eine Frage noch: Soll ich die Attribute dann private lassen oder ist protected da sinnvoller? In der Kindklasse greife ich jetzt ja nicht mehr direkt drauf zu.
 

Robat

Top Contributor
Wenn du in der Kindsklasse nicht drauf zugreifst kannst du sie ruhig private machen. Faustregel was die Sichtbarkeit angeht:
"So wenig wie möglich, so viel wie nötig". Da du von außen keinen direkten Zugriff brauchst, kannst du sie private machen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E abstrakte Klasse implementiert ein Interface Java Basics - Anfänger-Themen 40
T Abstrakte Klasse und Interfaces Java Basics - Anfänger-Themen 12
J abstrakte Methode in Klasse mit Rückgabetyp der abgeleiteten Klasse Java Basics - Anfänger-Themen 5
I Abstrakte Klasse - static Attribute deklarieren Java Basics - Anfänger-Themen 14
T Übungsaufgabe abstrakte Klasse Java Basics - Anfänger-Themen 21
kilopack15 Beziehung Interface - (abstrakte) Klasse -Unterklasse Java Basics - Anfänger-Themen 3
K Abstrakte Klasse: vererbte Klasse; instance of? Java Basics - Anfänger-Themen 26
N Vererbung Abstrakte Klasse stateful Java Basics - Anfänger-Themen 3
W Abstrakte Klasse mit Variable? Java Basics - Anfänger-Themen 2
A Vererbung Abstrakte Klasse mit Methode die Objekte der Subklassen benutzt? Java Basics - Anfänger-Themen 7
W Abstrakte und konkrete Klasse Java Basics - Anfänger-Themen 4
F Abstrakte Klasse doch zum "Teil" instanzieren? Java Basics - Anfänger-Themen 4
M Statische Methoden in Interface/Abstrakte Klasse Java Basics - Anfänger-Themen 6
N Datentypen abstrakte Klasse wird instanziert Java Basics - Anfänger-Themen 3
propra Interface - abstrakte Klasse Java Basics - Anfänger-Themen 18
N Abstrakte Klasse Java Basics - Anfänger-Themen 28
L Über abstrakte Klasse auf eine Klasse zugreifen? Java Basics - Anfänger-Themen 6
D Wann genau abstrakte Klasse und wann ein Interface verwenden? Java Basics - Anfänger-Themen 4
StupidAttack Abstrakte Methoden in nicht-abstrakter Methode in abstrakter Klasse Java Basics - Anfänger-Themen 6
T Abstrakte Klasse Java Basics - Anfänger-Themen 3
S Abstrakte Klasse Java Basics - Anfänger-Themen 5
K Abstrakte Klasse vs. Interface Java Basics - Anfänger-Themen 21
K Abstrakte Klasse bilden? Java Basics - Anfänger-Themen 11
S Abstrakte Klasse, festlegen, dass Methode verändert werden muss. Java Basics - Anfänger-Themen 4
H Warum Java? | Abstrakte Klasse = Modul? Java Basics - Anfänger-Themen 20
J abstrakte klasse und methode super Java Basics - Anfänger-Themen 2
H Eine Abstrakte Klasse muss. Java Basics - Anfänger-Themen 7
G Abstrakte Klasse "Point" Java Basics - Anfänger-Themen 2
G Abstrakte Methode in gleicher Klasse aufrufen Java Basics - Anfänger-Themen 5
M abstrakte Klasse Java Basics - Anfänger-Themen 3
F Abstrakte Klasse: Konstruktor vs init() Java Basics - Anfänger-Themen 13
G Abstrakte Klasse (was passiert hier) Java Basics - Anfänger-Themen 3
G Interface oder Abstrakte Klasse? Java Basics - Anfänger-Themen 3
Acha Unterschied Interface - abstrakte Klasse Java Basics - Anfänger-Themen 4
B OOP: abstrakte klasse implementiert interface Java Basics - Anfänger-Themen 3
D Abstrakte Klasse Graphics Java Basics - Anfänger-Themen 3
A Abstrakte Klasse Java Basics - Anfänger-Themen 3
G abstrakte klasse Java Basics - Anfänger-Themen 6
F Abstrakte Klasse Baum Java Basics - Anfänger-Themen 6
J Methodenaufrufe abstrakte Klassen, Interfaces Java Basics - Anfänger-Themen 17
M Abstrakte Klassen - Notation Java Basics - Anfänger-Themen 9
S Vererbung Abstrakte Methoden: Wozu das Ganze?! Java Basics - Anfänger-Themen 7
S abstrakte methoden in subclass? Java Basics - Anfänger-Themen 7
G Abstrakte Klassen Java Basics - Anfänger-Themen 11
G Java Abstrakte Methoden Java Basics - Anfänger-Themen 2
L Abstrakte Typen und Schnittstellen Java Basics - Anfänger-Themen 19
S Abstrakte Methode nutzen Java Basics - Anfänger-Themen 9
J Objekte und Abstrakte Klassen Java Basics - Anfänger-Themen 2
J Java Interface/abstrakte Klassen Java Basics - Anfänger-Themen 2
M Erste Schritte Prüfungsbeispiel: Interface / abstrakte Klassen Java Basics - Anfänger-Themen 8
A Interface Abstrakte Interface Methode kann nicht benutzt werden Java Basics - Anfänger-Themen 10
S Gehaltsberechnung (Vererbung, abstrakte Methoden) Java Basics - Anfänger-Themen 6
S Datentypen Abstrakte Datentypen Java Basics - Anfänger-Themen 0
A Abstrakte Datentypen - Methode delete Java Basics - Anfänger-Themen 6
D Abstrakte Klassen Verständniss Frage Java Basics - Anfänger-Themen 4
D Methoden Abstrakte Methoden Java Basics - Anfänger-Themen 3
D Interface Interfaces und abstrakte Klassen implementieren Java Basics - Anfänger-Themen 4
B Abstrakte Klassen Java Basics - Anfänger-Themen 7
C Abstrakte und virtuelle Methoden in Java Java Basics - Anfänger-Themen 4
E verdeckte abstrakte Methode sinnvoll? Java Basics - Anfänger-Themen 7
S Abstrakte Klassen Java Basics - Anfänger-Themen 2
C Dynamische Referenz & abstrakte Klassen Java Basics - Anfänger-Themen 3
V Interface Interfaces und abstrakte Klassen Java Basics - Anfänger-Themen 3
H Abstrakte Basisklasse Verständnisproblem! Java Basics - Anfänger-Themen 8
G Abstrakte Klassen - theoretische Frage Java Basics - Anfänger-Themen 2
OnDemand Abstrakte Klassen Java Basics - Anfänger-Themen 4
T OOP Abstrakte Klassen und ihre Kinder: wie läuft das? Java Basics - Anfänger-Themen 3
M Abstrakte Klassen Java Basics - Anfänger-Themen 2
J Interfaces Abstrakte Klassen Java Basics - Anfänger-Themen 15
M Interface und Abstrakte Klassen Java Basics - Anfänger-Themen 12
D Methoden abstrakte Methoden und Rückgabewerte Java Basics - Anfänger-Themen 2
B Abstrakte Methode vs. Interface Java Basics - Anfänger-Themen 2
R Namenskonvention abstrakte Klassen Java Basics - Anfänger-Themen 6
C OOP Objektstruktur: abstrakte Klassen Java Basics - Anfänger-Themen 3
V Vererbung Abstrakte Methode Java Basics - Anfänger-Themen 3
T OOP abstrakte klassen - methoden Java Basics - Anfänger-Themen 8
M Abstrakte Klassen Java Basics - Anfänger-Themen 21
J Welchen Sinn haben abstrakte Methoden? Java Basics - Anfänger-Themen 4
D Abstrakte Klassen und Interfaces als Paramter in Funktionen Java Basics - Anfänger-Themen 3
T Interfaces: Braucht man abstrakte Klassen eigentlich noch? Java Basics - Anfänger-Themen 3
T OO, Konstruktor, abstrakte Methoden Java Basics - Anfänger-Themen 13
T Abstrakte Klassen Java Basics - Anfänger-Themen 6
C abstrakte Klassen mögen mich nicht... Java Basics - Anfänger-Themen 2
I Abstrakte Klassen Java Basics - Anfänger-Themen 8
D Zusammenfassung von Klassen (Vererbung? Abstrakte Klass? ...?) Java Basics - Anfänger-Themen 8
G Abstrakte Klassen und Methoden Java Basics - Anfänger-Themen 3
C Schnittstellen und Abstrakte Klassen Java Basics - Anfänger-Themen 3
I Abstrakte Klassen Java Basics - Anfänger-Themen 22
G Abstrakte Klassen ? Java Basics - Anfänger-Themen 9
nadoria abstrakte Klassen Java Basics - Anfänger-Themen 6
M Unterscheid Abstrakte Klassen/Interface Klassen? Java Basics - Anfänger-Themen 7
T abstrakte Klassen? Java Basics - Anfänger-Themen 2
G konkretes beispiel: interface hier besser als abstrakte kl. Java Basics - Anfänger-Themen 4
M abstrakte klassen und interfaces Java Basics - Anfänger-Themen 2
L abstrakte Methode nicht implementiert! Java Basics - Anfänger-Themen 5
M abstrakte klassen / Schnittstellen Java Basics - Anfänger-Themen 4
H abstrakte Klassen, Interfaces Java Basics - Anfänger-Themen 13
R Interfaces durch abstrakte Klassen ersetzbar? Java Basics - Anfänger-Themen 8
A Eine abstrakte Methode static machen? Java Basics - Anfänger-Themen 4
A Abstrakte Klassen und Interfaces Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben