Sub- und Superklassen

Xknight

Aktives Mitglied
Wie kann ich meine Fehler in der Subklasse in meiner Superklasse fixieren, obwohl ich es wie im Lehrbuch gemacht habe?
Da bei meinen Subklassen wird immer ein Fehler angezeigt.
Java:
public abstract class Milchprodukt implements Produzierbar {
    private double fettgehalt;
    Zutat [] zutat;


    public double getFettgehalt() {
        return fettgehalt;
    }

    public void setFettgehalt(double fettgehalt) {
        this.fettgehalt = fettgehalt;
    }
   
    public class Produkt extends Milchprodukt{
        private String name;
        protected int anzahlVorhanden;
       
    }
   


    public class Zutat extends Milchprodukt{
        private String name;
        protected int anzahlVerfügbarerEinheiten;
    }

    public Milchprodukt(String name,int anzahlVorhanden,int anzahlVerfügbarerEinheiten,Zutat[] zutat, double fettgehalt) {
        super(name,anzahlVorhanden,anzahlVerfügbarerEinheiten);
        this.zutat=zutat;
        this.fettgehalt=fettgehalt;
       
        this.zutat = new Zutat[10];
       
    }


    public boolean produzieren(int anzahl) {
        if(anzahl>=zutat.length) {
            anzahlVorhanden+=anzahl;
            anzahlVerfügbarerEinheiten-=anzahl;
            return true;
        }
        return false;
    }
   
    public boolean addZutat(Zutat anzahladd) {
        for(int i = 0; i<zutat.length;i++) {
            if(zutat[i]==null) {
                zutat[i] = anzahladd;
                return true;
            }
        }
        return false;
       
    }
   
    public boolean removeZutat(Zutat[] zutat) {
        for(int i = 0;i<zutat.length;i++) {
            if(zutat[i] != null) {
                zutat[i]=null;
                return true;
            }
        }
        return false;
    }

}
 

LimDul

Top Contributor
Erst mal:
Da bei meinen Subklassen wird immer ein Fehler angezeigt.
Dann poste den Fehler auch bitte, dass macht die Sache einfacher.

Willst du wirklich Produkt & Zutat als Innere Klassen von MilchProdukt haben?. Und das Produkt eine Subklasse von Milchprodukt ist, hört sich falsch an. Genauso das Zutat eine Subklasse von MilchProdukt sein soll.

Weiterhin hat MilchProdukt keinen Parameterlosen Konstruktor - damit musst du in allen Subklassen (Hier: Produkt/Zutat) einen Konstruktor definieren, der den Super-Konstruktor aufruft.

Wie soll deine Klassenhierarchie überhaupt aussehen?
 

Xknight

Aktives Mitglied
Bei beiden Subklassen lautet der Fehler: Implicit super constructor Milchprodukt() is undefined for default constructor. Must define an explicit constructor.
Beim super(...) lautet der Fehler: The object (String,int,int) is undefined.
 

LimDul

Top Contributor
Was beides auch logisch ist.

MilchProdukt erbt von Objekt - hat damit keinen Super-Konstruktor (bzw. nur den parameterlosen)
Also ist der aufruf von super mit Parametern da falsch.

Und deine Subklassen hingegen müssen mittels super den Konstruktor von Milchprodukt aufrufen, der Parameter erwartet.

Aber wie gesagt - deine Klassenhierarchie sieht falsch aus.
 

Xknight

Aktives Mitglied
Warum sollte meine Klassenhierarchie falsch sein wenn dass von mir verlangt wird.
Wie mache ich denn den Superkonstruktor mit einem Parameter und wie kann ich meine Subklassen mittels Superkonstruktor aufrufen?
 
K

kneitzel

Gast
Evtl. hilft bei der Betrachtung auch einfach folgende Aussage:

So eine Ableitung einer Klasse ist eine "ist ein" Beziehung.

Wenn B von A erbt, dann kann man sagen: B ist ein A.

Wenn Produkt von Milchprodukt erbt, dann würde das bedeuten: Ein Produkt ist ein Milchprodukt. Und dem ist doch schlicht nicht so, denn es gibt Produkte, die kein Milchprodukt sind, oder?
 

mihe7

Top Contributor
Das Ding ist, dass von mir verlangt wird, das Produkt und Zutat eine Subklasse von der Superklasse Milchprodukt sein soll.
Und da bist Du Dir 100 %-ig sicher?

Wenn das so sein soll, dann ist es halt so. Den Konstruktor von Milchprodukt kannst Du aber in der Form vergessen. Dein UML-Diagramm sieht also etwa so aus (^ ist Generalisierung):
Code:
 java.lang.Object
       ^
       |        «implements»
+--Milchprodukt - - - - - - > Produzierbar
|      ^
|      |
|  +---+---+
v* |       |
Zutat     Produkt

Richtig?
 

Xknight

Aktives Mitglied
Ich habe mich im Internet eingelesen und es sollte eigentlich so klappen.
Java:
public abstract class Milchprodukt implements Produzierbar {
    protected double fettgehalt;
    Zutat [] zutat;


    public double getFettgehalt() {
        return fettgehalt;
    }

    public void setFettgehalt(double fettgehalt) {
        this.fettgehalt = fettgehalt;
    }
        Milchprodukt(String name,int anzahlVorhanden,int anzahlVerfügbarerEinheiten,Zutat[] zutat, double fettgehalt) {
        super(name,anzahlVorhanden,anzahlVerfügbarerEinheiten);
        this.zutat=zutat;
        this.fettgehalt=fettgehalt;
        
        this.zutat = new Zutat[10];
        
    }
    
    class Produkt extends Milchprodukt{
        protected String name;
        protected int anzahlVorhanden;
        
        Produkt(double fettgehalt) {
        super(fettgehalt);
        }
        
    }
    
    public class Zutat extends Milchprodukt{
        protected String name;
        protected int anzahlVerfügbarerEinheiten;
        
        Zutat(double fettgehalt){
            super(fettgehalt);
        }
        
        
    }


    public boolean produzieren(int anzahl) {
        if(anzahl>=zutat.length) {
            anzahlVorhanden+=anzahl;
            anzahlVerfügbarerEinheiten-=anzahl;
            return true;
        }
        return false;
    }
    
    public boolean addZutat(Zutat anzahladd) {
        for(int i = 0; i<zutat.length;i++) {
            if(zutat[i]==null) {
                zutat[i] = anzahladd;
                return true;
            }
        }
        return false;
        
    }
    
    public boolean removeZutat(Zutat[] zutat) {
        for(int i = 0;i<zutat.length;i++) {
            if(zutat[i] != null) {
                zutat[i]=null;
                return true;
            }
        }
        return false;
    }

}
 

Xknight

Aktives Mitglied
Das ist ja mein Problem der ganzen Sache. Was genau bewirkt dieses java.lang.Object und wie kann ich es in meiner Klasse verwenden und wie kann ich meinem Konstruktor mit Parametern versehen?
 

mihe7

Top Contributor
Was genau bewirkt diese java.lang.Object
Das ist die "Mutter aller Klassen" in Java. Jede Klasse ist direkt oder indirekt von java.lang.Object abgeleitet.

und wie kann meinem Konstruktor mit Parametern versehen?
Dein Konstruktor hat ja Parameter. Du darfst nur super nicht mit Parametern aufrufen.

Java:
        Milchprodukt(String name,int anzahlVorhanden,int anzahlVerfügbarerEinheiten,Zutat[] zutat, double fettgehalt) {
        this.zutat=zutat;
        this.fettgehalt=fettgehalt;
        
        this.zutat = new Zutat[10];
        
    }

Das dürfte kompilieren, aber die Mehrzal der Parameter wird nicht genutzt.

Wie lautet denn genau die Aufgabenstellung?
 

Xknight

Aktives Mitglied
Aber trotzdem erscheint bei den Subklassen Fehlermeldungen obwohl es eigentlich klappen sollte. So habe ich mich auch im Internet eingelesen und dies wurde so im Internet beschrieben.
 

Xknight

Aktives Mitglied
Sorry aber wenn ich das machen würde, dann würde ich trotzdem die selben Fehlermeldung in der Klasse Produkt bekommen und habe auch die selben Fehlermeldungen bei meinen Subklassen.
 

mihe7

Top Contributor
Sorry aber wenn ich das machen würde, dann würde ich trotzdem Fehlermeldung in der Klasse Produkt bekommen.
Was heißt "wenn ich das machen würde"? Die Aufgabe verlangt, das so zu machen. Und nein, Du würdest keinen Fehler bekommen, weil Milchprodukt dann einfach den Konstruktor von Produkt verwenden kann.
 

temi

Top Contributor
Ich helfe dir mal auf die Sprünge:

Java:
public abstract class Produkt implements Produzierbar {
    
}

public abstract class Milchprodukt extends Produkt {
    
}

Das ist die Basis.
 

Xknight

Aktives Mitglied
Java:
public abstract class Milchprodukt implements Produzierbar {
    protected double fettgehalt;
    Zutat [] zutat;


    public double getFettgehalt() {
        return fettgehalt;
    }

    public void setFettgehalt(double fettgehalt) {
        this.fettgehalt = fettgehalt;
    }
        Milchprodukt(boolean fruchtYoghurt,Zutat[] zutat, double fettgehalt) {
        this.zutat=zutat;
        this.fettgehalt=fettgehalt;
        
        this.zutat = new Zutat[10];
        
    }
    
        public class Kaese extends Milchprodukt{
        protected boolean fruchtYoghurt;
        public Kaese(boolean fruchtYoghurt) {
            super(fruchtYoghurt);
        }
        
    }
    
        public class Yoghurt extends Milchprodukt{
        
        
        
    }


    public boolean produzieren(int anzahl) {
        if(anzahl>=zutat.length) {
            anzahlVorhanden+=anzahl;
            anzahlVerfügbarerEinheiten-=anzahl;
            return true;
        }
        return false;
    }
    
    public boolean addZutat(Zutat anzahladd) {
        for(int i = 0; i<zutat.length;i++) {
            if(zutat[i]==null) {
                zutat[i] = anzahladd;
                return true;
            }
        }
        return false;
        
    }
    
    public boolean removeZutat(Zutat[] zutat) {
        for(int i = 0;i<zutat.length;i++) {
            if(zutat[i] != null) {
                zutat[i]=null;
                return true;
            }
        }
        return false;
    }

}
 

temi

Top Contributor
Du möchtest sicher keine inneren Klassen, oder?

Das hier nicht:

Java:
class ÄußereKlasse {
    
    class InnereKlasse {
        
    }
}
 

temi

Top Contributor
Vergleich doch mal mit deinem Code:

Edit: Das Interface wurde von der falschen Klasse implementiert. Danke an @mihe7 für sein UML.

Java:
public abstract class Produkt {

}

public abstract class Milchprodukt extends Produkt implements Produzierbar {

}

public class Kaese extends Milchprodukt {

}

public class Yoghurt extends Milchprodukt {

}


Dein Code, etwas reduziert:
Java:
public abstract class Milchprodukt implements Produzierbar {

    public class Kaese extends Milchprodukt{
     
    }
 
    public class Yoghurt extends Milchprodukt{
     
    }
}
 
Zuletzt bearbeitet:

Xknight

Aktives Mitglied
Java:
public boolean produzieren(int anzahl) {
        if(anzahl>=zutat.length) {
            anzahlVorhanden+=anzahl;
            anzahlVerfügbarerEinheiten-=anzahl;
            return true;
        }
        return false;
    }
Wie kann ich die Variablen anzahlVorhanden und anzahlVerfügbarerEinheiten von den Klassen Produkt und Zutat aansprechen?
 

Xknight

Aktives Mitglied
Sorry :D ,
Java:
    public boolean produzieren(int anzahl, anzahlVorhanden) {
        if(anzahl>=zutat.length) {
            zutat = new Zutat();
            zutat.getAnzahlVorhanden();
            
            return true;
        }
        return false;
    }
Das Attribut "anzahlVorhanden" aus der Klasse Zutat müsse dann auch als Parameter aufgerufen werden, oder?
Wenn ich es so codiere ist der "anzahlVorhanden" Paramater mit einer Fehlermeldung "Syntax error, insert "... VariableDeclaratorId" to complete FormalParameter" unterstrichen.
 

temi

Top Contributor
Außerdem wird deine bisherige Methode nicht das tun, was sie tun soll:
Die Methode produzieren bekommt die Anzahl der zu produzierenden Einheiten als int Parameter. Wenn bei jeder einzelnen Zutat mindestens genauso viele Einheiten verfügbar sind, dann kann die anzahlVorhanden um die produzierte Anzahl erhöht und die anzahlVerfuegbarerEinheiten bei den Zutaten um die produzierte Anzahl erniedrigt werden. Wenn es erfolgreich war, soll true, andernfalls falls, zurückgegeben werden.
 

Xknight

Aktives Mitglied
Ja, deshalb , mit "int anzahlVorhanden" funktioniert es ja auch nicht . Wie kann ich dann das Attribut anzahlVorhanden aus der Zutatklasse aufrufen?
 

Ähnliche Java Themen

Neue Themen


Oben