OOP-Aufgabe

jono

Top Contributor
Hallo !
Ich habe nur eine "kleine" Frage bis jetzt zu dieser Aufgabe, werde sie dennoch einfach mal komplett posten:
Java:
/*
      * Setzen Sie alle Attribute auf private und nutzen Sie zum Zugriff automatisch generierte Getter- und Setter-Methoden.
      *
      * Aufgabe 1) Erstellen sie 3 Klassen Klausur, Spickzettel und Coronazettel mit dem Attribut hatCorona (bool).
      *
      * Aufgabe 2) Erstellen sie eine abstrakte Klasse Papier, die an die 3 Klassen aus a) vererbt wird mit den Attributen Höhe (double), Breite (double) und Inhalt (LinkedList<String>) und
      * den Methoden void schreiben(String zeile, int index) und void radieren(int index). Sorgen Sie dafür, dass die Methoden nur in den Kind-Klassen sichtbar sind.
      *
      * Aufgabe 3) Schreiben Sie einen Konstruktor für Papier und Coronazettel, mit dem alle Attribute initialisiert werden können. Sorgen Sie dafür, dass der default-Konstruktor hier auch noch erreichbar ist!
    Erzeugen Sie zum Test einen Coronazettel ohne Initialisierung der Attribute und einen Coronazettel, bei dem der boolean hatCorona auf false gesetzt wird. Die anderen Attribute dürfen beliebig gewählt werden.
      *
      * Aufgabe 4) Erstellen sie ein Interface Faltbar mit der Methodensignatur für eine void Methode falten(int anzahl) das von der Klasse Coronazettel und Spickzettel
      * implementiert wird.
      *
      * Aufgabe 5) Implementieren sie die Methode schreiben der Klasse Papier folgendermaßen:
      * Die Methode soll den String zeile in der Liste Inhalt an der Stelle index speichern. Der Index darf nicht größer sein als die Aktuelle Anzahl an Zeilen+1.
      *
      * Aufgabe 6) Implementieren sie die Methode radieren der Klasse Papier folgendermaßen:
      * Die Methode soll den String an der stelle index in der Liste Inhalt löschen. Index darf nicht größer sein als die länge der Liste.
      *
      * Aufgabe 7) Implementieren sie die Methode falten in den Klassen Coronazettel und Spickzettel folgendermaßen:
      * Die Methode faltet so oft wie der Parameter anzahl vorgibt. Dabei wird abwechselnd Höhe und Breite um die hälfte verringert.
      * Coronazettel dürfen nur 2 mal gefaltet werden sonst werden sie nicht angenommen.
      *
      * Aufgabe 8) Implementieren sie einen enum Papierart mit den Elementen LINIERT und KARIERT. Klausuren bekommen jetzt noch das Attribut papierart vom Typ PAPIERART. Passen sie den Konstruktor an.
      *
      * Aufgabe 9) Instanziieren sie einen Spickzettel und versuchen sie ihn zu falten.
    */
Das ist die bisherige Coronazettelklasse:
Java:
import java.util.LinkedList;

public class Coronazettel extends Papier {
   
    private boolean hatCorona;
   
    public Coronazettel(boolean hatCorona, double hoehe, double breite, LinkedList<String> lL) {
        super(hoehe, breite, lL);
        this.hatCorona = hatCorona;
    }
}
Unter "Aufgabe 3" steht ja: "Erzeugen Sie zum Test einen Coronazettel ohne Initialisierung der Attribute und einen Coronazettel, bei dem der boolean hatCorona auf false gesetzt wird. Die anderen Attribute dürfen beliebig gewählt werden."
Ich verstehe jetzt einfach nur nicht, wie ich das "erzeugen" soll...
 
Ein kleiner Verbesserungsvorschlag in Form einer Gegenfrage:

Warum nennst du den vierten Parameter von Coronazettel eigentlich "lL"? Die vorherigen hast du ja auch nach ihrer jeweiligen Funktion benannt und nicht "boolean", "double1" und "double2", bzw "b", "d1" und "d2".
 
Warum nennst du den vierten Parameter von Coronazettel eigentlich "lL"? Die vorherigen hast du ja auch nach ihrer jeweiligen Funktion benannt und nicht "boolean", "double1" und "double2", bzw "b", "d1" und "d2".
Den boolean und die zwei double wurden in ihrem Namen vorgegeben und bei LinkedList war freie Wahl, aber du hast recht, den Namen hätte ich sinnvoller geben können
 
Die Klasse sieht in der Lösung so aus:
Java:
import java.util.LinkedList;

public class Coronazettel extends Papier implements Faltbar {

    private boolean hatCorona;

    public Coronazettel(double hoehe, double breite, LinkedList<String> inhalt, boolean hatCorona) {
        super(hoehe, breite, inhalt);
        this.setHatCorona(hatCorona);

    }

    public boolean isHatCorona() {
        return hatCorona;
    }

    public void setHatCorona(boolean hatCorona) {
        this.hatCorona = hatCorona;
    }

    @Override
    public void falten(int anzahl) {
        if (anzahl > 2) {
            return;
        }
        for (int i = 1; i <= anzahl; i++) {
            if (i % 2 == 0) {
                this.setHoehe(this.getHoehe() / 2);
            } else {
                this.setBreite(this.getBreite() / 2);
            }
        }
    }

}
Der dritte Punkt fällt mir generell schwieriger.
Coronazettel zettel = new Coronazettel();
1. Wo wird der Code implementiert, in der Lösung z.B. kommt das nirgends vor, gibt es eine Klasse, die evtl. noch relevant wäre für "3"?
Das Objekt was @temi hier erzeugt hat ohne Initialisierung der Attribute wird jetzt in welcher Klasse erzeugt?
Bzw. wo wird jetzt das andere Objekt erzeugt, bei dem
Java:
 boolean hatCorona
auf false gesetzt wird und die anderen Attribute frei wählbar sind?
2. Wie sorge ich dafür, dass der default-Konstruktor erreichbar bleibt? Der ist doch sowieso in jeder Klasse erhalten oder...?
3. Weshalb wird in der Klasse aus diesem Beitrag jetzt hier
Java:
 this.setHatCorona(hatCorona);
implementiert?
 
1. Wo wird der Code implementiert, in der Lösung z.B. kommt das nirgends vor, gibt es eine Klasse, die evtl. noch relevant wäre für "3"?
Das Objekt was @temi hier erzeugt hat ohne Initialisierung der Attribute wird jetzt in welcher Klasse erzeugt?
Wenn in der Klasse explizit Konstruktoren angegeben sind, musst Du einen davon verwenden.
Wie sorge ich dafür, dass der default-Konstruktor erreichbar bleibt? Der ist doch sowieso in jeder Klasse erhalten oder...?
Nein, der default-Konstruktor existiert implizit nur dann, wenn kein Konstruktor in der Klasse explizit definiert wurde. Wenn Du den Konstruktor neben anderen in der Klasse haben willst, musst Du ihn Dir schreiben.

Weshalb wird in der Klasse aus diesem Beitrag jetzt hier
Java:
this.setHatCorona(hatCorona);
implementiert?
Keine Ahnung, beim Überfliegen der Aufgabenstellung ist mir jetzt nichts aufgefallen, wofür Du die Methode bräuchtest.
 
Wo wird der Code implementiert, in der Lösung z.B. kommt das nirgends vor, gibt es eine Klasse, die evtl. noch relevant wäre für "3"?

Erzeugen Sie zum Test einen Coronazettel ohne Initialisierung der Attribute und einen Coronazettel, bei dem der boolean hatCorona auf false gesetzt wird.

Da dort "zum Test" steht, nehme ich an in der main() oder halt da, wo deine Tests implementiert werden.
 
@temi In der 1. Zeile steht zwar, dass automatisch Getter und Setter generiert werden sollen, aber das sieht dann anders aus und dafür gibt es dann doch die set Methode die ja auch vorhanden ist ?
 
@temi In der 1. Zeile steht zwar, dass automatisch Getter und Setter generiert werden sollen, aber das sieht dann anders aus und dafür gibt es dann doch die set Methode die ja auch vorhanden ist ?
setHatCorona() sieht für mich 100%ig wie ein Setter aus und genau diese Methode wird auch aufgerufen.

Wie sollte denn deiner Meinung nach ein Setter aussehen, egal ob automatisch oder manuell generiert?
 
Das sind Getter und Setter. Ich frage mich nur, warum sethatCorona(boolean hatCorona) im Konstruktor steht?
Dann schau erst einmal genau hin - da steht this.setHatCorona(hatCorona); und das ist ein Aufruf des Setters.

Dem Konstruktor wird der Parameter übergeben und der dient dazu, diesen Wert zu setzen. Und der Setter ist nun einmal eine Möglichkeit, den Wert zu setzen.
 
Dem Konstruktor wird der Parameter übergeben und der dient dazu, diesen Wert zu setzen. Und der Setter ist nun einmal eine Möglichkeit, den Wert zu setzen.
Ich habe dich leider nicht ganz verstanden. Dem Konstruktor übergebene Parameter dienen ja erstmal dazu ein Objekt erzeugen zu können. Was genau meinst du mit "Wert setzen", kannst du evtl. da genauer etwas zu sagen vlt. ein Bsp.
 
Dem Konstruktor übergebene Parameter dienen ja erstmal dazu ein Objekt erzeugen zu können. Was genau meinst du mit "Wert setzen", kannst du evtl. da genauer etwas zu sagen vlt. ein Bsp.
Mit der Übergabe alleine passiert ja noch nichts.
Java:
class A {
   public A(int wert) {
   }
}
Wenn Du jetzt ein Objekt A erzeugst, kannst Du als Wert angeben, was Du willst: der Wert wird einfach ignoriert.

In der Regel verwendet man den übergebenen Wert, um die Attribute des Objekts zu initialisieren:
Java:
class A {
   private int meinWert;

   public A(int wert) {
       meinWert = wert; // initialisiert meinWert mit wert
   }
}
 
Dem Konstruktor übergebene Parameter dienen ja erstmal dazu ein Objekt erzeugen zu können. Was genau meinst du mit "Wert setzen", kannst du evtl. da genauer etwas zu sagen vlt. ein Bsp.
Du hast doch schon ein Beispiel. Hier etwas vereinfacht und um eine zweite Möglichkeit ergänzt.
Java:
public class Coronazettel {

    private boolean hatCorona;

    // Konstruktor übernimmt einen Parameter
    public Coronazettel(boolean hatCorona) {
        // 1. Möglichkeit: Aufruf des Setters und Weitergabe des Parameters an den Setter
        this.setHatCorona(hatCorona);
        
        // 2. Möglichkeit: Parameter direkt an Instanzvariable zuweisen
        this.hatCorona = hatCorona;
    }

    // Setter übernimmt einen Parameter
    public void setHatCorona(boolean hatCorona) {
        // und weist diesen der Instanzvariable zu
        this.hatCorona = hatCorona;
    }
}
 

Zurück
Oben