Vererbung

Hallo zusammen,

ich sitze an einem Problem was die Vererbung angeht momentan fest. Ich habe 3 Klassen: PalletManager, Pallet sowie Flüssigkeiten.
Flüssigkeiten erbt von der Klasse Pallet.
Java:
package main.goods;

public class Pallet {

    private String description = "";
    private int id;
    private int width;
    private int depth;
    protected int heigth;
    private boolean cooling;
    private long incoming;
    private int outgoing;

    private static int nextid = 1;

    /**
     * Creates a pallet from given values
     * @param description - describes the content
     * @param width - width of the pallet
     * @param depth - depth of the pallet
     * @param height - height of the pallet
     * @param cooling - true, if the pallet requires cooling
     * @param duration - estimated duration of stocking in days
     */
    public Pallet(String description, int width, int depth, int height, boolean cooling, int duration) {
        this.id = nextid++;
        this.description = description;
        this.width = width;
        this.depth = depth;
        this.heigth = height;
        this.cooling = cooling;
        this.incoming = System.currentTimeMillis();
        this.outgoing = (int) this.incoming + (duration * 24 * 60 * 60 * 1000);
    }

    /**
     * Generates a human-readable string with basic information.
     * @return basic information about the pallet
     */
    public String getText() {
        StringBuffer result = new StringBuffer("[" + id + "] " + description + "(" + width + "x" + depth + "x" + heigth + ")");

        //todo: append weight and total value
        
        return result.toString();
    }

    public String getDescription() {return description;}
    public int getId() {return id;}
    public int getWidth() {return width;}
    public int getDepth() {return depth;}
    public int getHeigth() {return heigth;}
    public boolean isCooling() {return cooling;}
    public long getIncoming() {return incoming;}
    public int getOutgoing() {return outgoing;}
}
Die Klasse Flüssigkeiten welche von Pallet erbt:
Java:
package main;

import main.goods.Pallet;

public class Flüssigkeiten extends Pallet {
    public int auslass = 100;
    public static double Dichte;
    public double Preis;
    private double KemlerZahl;
    private double UnNummer;

    public double getDichte() {return 729 * Dichte * (auslass/100);}
    public double getPreis() {return 729 * Preis * (auslass/100);}

    public void setDichte(double dichte) {
        Dichte = dichte;
    }

    public void setPreis(double preis) {
        Preis = preis;
    }

    public String getString () {return super.getText() + Dichte + Preis;}

    public Flüssigkeiten (String description, boolean cooling, double Preis, int Lagerdauer, double Dichte, double KemlerZahl, double UnNummer) {
        super(description, 90, 90, 90, cooling, Lagerdauer);
        this.Dichte = 729 * Dichte * (auslass/100);
        this.Preis = 729 * Preis * (auslass/100);
        this.KemlerZahl = KemlerZahl;
        this.UnNummer = UnNummer;
    }
}
Okay hier ist meine Frage: Wie kann ich in meiner Pallet Klasse (genauer in der Methode get Text auf meine Eigenschaften aus der Klasse Flüssigkeiten (Preis und Dichte) zugreifen, sodass wenn ich in meiner Main Klasse ein neues Pallet Objekt erstelle und den Konstruktor aus Flüsigkeiten aufrufe diese Werte mir dann auch mit der Methode getText aufrufen kann.

Vielen Dank fürs lesen und eure Hilfe!
 
Verwende keine deutschen Umlaute in Klassen-/Variablennamen. Das kann zu Problemen führen.

Zu deinem Problem: Entweder du änderst die Sichtbarkeit der Instanzvariablen von Pallet von private zu protected oder du führst für die gewünschten Werte getter-Methoden ein. Die können auch protected sein, wenn sie von außerhalb nicht benötigt werden.

Edit: Nicht genau hingeschaut. Du hast ja bereits getter-Methoden.

Edit2: Einige der Instanzvariablen von Flüssigkeiten sind public. Das sollte man vermeiden. Generell gilt beim Design von Klassen, dass eine Klasse sowenig wie möglich von sich nach außen preisgeben soll und nur soviel wie nötig. Deshalb ist es auch nicht so, dass man immer für alle Werte Getter und Setter programmiert. Eher im Gegenteil. Der innere Status sollte im Idealfall über die Funktion der Klasse geändert werden, nicht durch gezielten Zugriff auf Einzelwerte. Ein Beispiel dafür wäre eine Klasse Auto, die über einen Tankinhalt als Instanzvariable verfügt. Anstatt einen Setter für diesen Wert zu programmieren, sollte die Veränderung des Tankinhalts über ein Methode Fahre(int km) geschehen.
 
Zuletzt bearbeitet:
Danke für deine Hinweise aber das hilft mir ja jetzt auch nicht weiter.
Auch wenn ich die Sichtbarkeit von Pallet Eigenschaften von private auf protected stelle, will ich ja in meiner Pallet Klasse
auf die Eigenschaften der vererbten Klasse (Flüssigkeiten zugreifen).
Vielleicht noch ein wenig genauer warum ich es nicht einfach in der Main Methode über ein Flüssigkeiten Objekt aufrufe:

Wir haben ein Pallet Array gegeben und können durch ein neues PalletObjekt den Konstruktor aus Flüssigkeiten aufrufen.
 
Danke für deine Hinweise aber das hilft mir ja jetzt auch nicht weiter.
Auch wenn ich die Sichtbarkeit von Pallet Eigenschaften von private auf protected stelle, will ich ja in meiner Pallet Klasse
auf die Eigenschaften der vererbten Klasse (Flüssigkeiten zugreifen).
Oh, sorry. Falsch verstanden. Das geht nicht. Woher soll den die vererbende Klasse wissen, an wen sie alles vererbt wird. Neben Flüssigkeiten könnte es ja noch 1000 andere Klassen geben, die von Pallet erben.

Aber probier doch mal aus:
Java:
public class Foo {

    private int value = 42;

    public int getValue() {
        return value;
    }

    public String getText() {
        return "" + value;
    }
}

public class Bar extends Foo {

    private int value2 = 24;

    @Override
    public String getText() {
        return "" + getValue() + value2;
    }
}

public class Main {

    public static void main(String[] args) {
        Foo foo = new Bar();
        System.out.println(foo.getText());
    }
}
 
Zuletzt bearbeitet:
Auch dann sehe ich nicht, warum eine Flüssigkeit eine Palette sein sollte.

@Individuum
Ich würde dir raten, dir das mit der Vererbung nocheinmal genauer anzusehen. Vererbung kann man dann machen, wenn eine Ist-Ein-Beziehung vorliegt. Ist Flüssigkeit ein Pallet? Oder ist es nicht eher eine Hat-Ein-Beziehung (Pallet hat eine Flüssigkeit)?
 
Auch dann sehe ich nicht, warum eine Flüssigkeit eine Palette sein sollte.
Eine Flüssigkeit an sich ist natürlich keine Palette. Aber ich denke jetzt an IBC-Behälter. Das sind stapelbare Behälter für Flüssigkeiten im Europalettenformat.

Ob es für die Aufgabe eine bessere Lösung gibt? Keine Ahnung. Wir kennen ja die Aufgabe nicht.
 
@White_Fox der Name ist nicht optimal gewählt ja. Paletten können aber alles Lagern. Zum Beispiel Flüssigkeiten, Feststoffe etc.
Wieso soll da keine Vererbung möglich sein?
 
Sehr oft kannst du Klassen so aufbauen, wie die Realität die Objekte hergibt.

Du könntest z.B. eine Superklasse 'Behälter' haben, und davon die Klassen Palette, Container, Faß, Flasche, ... ableiten. Diese könnten die Methoden füllen(), leeren(), ... miteinander teilen.

Du könntest eine Superklasse 'Flüssigkeit' haben, und davon Benzin, Spiritus, Schnaps, ... ableiten. Diese könnten z.B. die Eigenschaften Dichte, Preis, ... miteinander teilen.

Ich sehe aber nicht, wie eine Flüssigkeit und ein Behälter irgendetwas gemeinsam haben, das sind völlig verschiedene Dinge. Wenn du der Klasse Palette eine Methode stapeln() mitgibst, würde die Klasse Flüssigkeit diese auch implementieren müssen. Ergibt es aber irgendeinen Sinn, Flüssigkeiten stapeln zu wollen?
 
Nur weil die Namensgebung optimal ist muss es ja nicht heißen dass es nicht funktioniert ;)
So eine Modellierung steht und fällt mit der Namensgebung, und spätestens wenn man mit anderen drüber reden will, sollte die Namensgebung möglichst optimal sein :)

@White_Fox der Name ist nicht optimal gewählt ja. Paletten können aber alles Lagern. Zum Beispiel Flüssigkeiten, Feststoffe etc.
Wieso soll da keine Vererbung möglich sein?
Formuliere mal „X ist ein Y“, und setz für X und Y deine Klassen ein :)
 
Nur weil die Namensgebung optimal ist muss es ja nicht heißen dass es nicht funktioniert
Egal wie du deine Klassen nennst, irgendeine Funktion werden sie doch hoffentlich erfüllen und etwas repräsentieren. Also versuche, eine Antwort auf meine Frage zu finden: Ergibt es irgendeinen Sinn, etwas, das eine Flüssigkeit repräsentieren soll, stapeln zu wollen?

Das, was du herzustellen versuchst, ist eine IST-EIN-Beziehung. Was du aber tatsächlich hast, ist eine HAT-EIN-Beziehung, das mußt du auseinanderhalten. Und als Ergänzung zu @mrBrown : Formuliere mal "X hat ein Y" und setz für X und Y deine Klassen ein.

Übrigens ist dieses "Zuweisen von Bedeutung" ein ganz elementarer Bestandteil der Informatik. So jedenfalls meine Beobachtung als Nichtinformatiker.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben