Übungsaufgabe abstrakte Klasse

tk22k

Mitglied
Hi,

ich bin neu hier im Forum und konnte schon eine Menge von euch lernen.
Jetzt hapert es allerdings bei ein paar Übungsaufgaben bei mir und ich
bräuchte Hilfe diese umzusetzen.

Hier ist eine Aufgabe zu einer abstrakten Klasse
Definieren Sie eine abstrakte Klasse Ausgabe mit der privaten(!) Instanzvariablen fehlercode vom Typ int und der abstrakten Methode zeigeFCode ohne Rückgabewert. Ein Konstruktor soll fehlercode mit einer beliebigen Zahl x füllen können. Definieren Sie eine nicht abstrakte Klasse Textausgabe als Unterklasse von Ausgabe, die in einer Methode fcodeAnzeigen die in fehlercode gespeicherte Zahl in der Form „Fehlercode=x“ auf der Konsole ausgibt. Falls fehlercode eine negative Zahl ist, soll fcodeAnzeigen den Text „Systemfehler=x“ ausgeben.

Bei der Aufgabe habe ich ein Problem mit der privaten Instanzvariable fehlercode.
Ich weiß nicht wie ich diese in Textausgabe ansprechen kann. Meine Überlegung ist
es diese in protected zu ändern was aber vermutlich gegen die Aufgabe spricht.
Zusätzlich weiß ich nicht wofür die abstrakte Methode zeigeFCode sein soll.

Hier mal mein Versuch


Java:
public abstract class Ausgabe {

    protected int fehlercode;

    public Ausgabe(int x) {fehlercode = x;}
   
    abstract void zeigeFCode();
}

class TextAusgabe extends Ausgabe {

    public TextAusgabe(int x) {super(x);}

    public void fcodeAnzeigen() {zeigeFCode();}

    public void zeigeFCode() {
        if (fehlercode >= 0) {
            System.out.println("Fehlercode=" + fehlercode);
        } else {
            System.out.println("Systemfehler=" + fehlercode);
        }
    }
}

Über Hilfe würde ich mich sehr freuen. Vielen Dank
 
Also die Aufgabe erscheint mir ebenfalls sehr komisch. Hast du die sicher richtig abgetippt? Es macht keinen Sinn explizit eine "private" Variable zu verlangen und diese dann in einer erbenden Klasse verwenden zu wollen. Wie du schon festgestellt hast ginge sowas nur mir "protected". Auch ist mir nicht wirklich klar was die abstrakte Methode zeigeFCode genau machen soll...

Wenn man jetzt davon ausgeht dass sich da verschrieben wurde und tatsächlich "protected int" gemeint war, ist deine Variante schonmal ganz in Ordnung. Wobei, wenn ich mich mehr an den direkten Aufgabentext halte, würde ich die Klasse "TextAusgabe" eher so gestalten:

Code:
class TextAusgabe extends Ausgabe {
    
    public TextAusgabe(int x) {super(x);}
    
    public void fcodeAnzeigen() {
        if (fehlercode >= 0) {
            System.out.print("Fehlercode=");
        } else {
            System.out.print("Systemfehler=");
        }
        
        zeigeFCode();
        System.out.println();
    }
    
    @Override
    public void zeigeFCode() {
        System.out.print(fehlercode);
    }
}

Funktion wäre aber die selbe wie bei dir. Bei mir entscheidet halt direkt die Methode "fcodeAnzeigen()" ob "fehlercode" kleiner 0 ist. Und die abstrakte Methode "zeigeFCode()" gibt lediglich den "fehlercode" aus.
Was anderes fällt mir zu der Aufgabe nicht ein. Stammt die aus einem Buch?
 
Ich finde die Aufgabe auch etwas seltsam. Um die Forderung private int fehlercode; nicht zu verletzen, könnte man in der abstrakten Klasse noch einen getter implementieren.
 
Ich würde es auf protected ändern und einen Kommentar dazu schreiben, dass eben mit private kein Zugriff möglich ist. Alternativ ist der Vorschlag von @Meniskusschaden auch nicht schlecht, aber auch hier würde ich einen Kommentar ranschreiben, warum die Methode nötig ist.

Von diesem Problem mal abgesehen, finde ich aber auch den Stil, der euch da aufgedrückt wird, fragwürdig: Deutsche Klassen- und Variablennamen? Ein abstrakter Methodenname, der nicht voll ausgeschrieben ist? Für mich ist das alles "Code Smell"!
 
Ok Vielen dank für die schnellen Antworten.
Ich hatte mir schon fast gedacht, dass an dieser Aufgabe irgendetwas nicht stimmt.
Zur Sicherheit wollte ich dieses aber noch einmal abklären. Es könnte ja sein
das ich was verpasst habe mit den private variablen in abstrakten Klassen.
@Meiskuschhaden das war auch meine erste Überlegung, aber damit hätte ich eine
weitere Methode einführen müssen die laut Aufgabe nicht definiert ist.
 
Zum Glück stammt dies Aufgabe nicht aus einem Buch sondern von einem Übungszettel.
Ich hätte noch eine Aufgabe zum Event Handling die mir auch sehr speziell vorkommt.
Diese wollte ich auch gerne besprechen. Sollte ich dafür ein neues Thema eröffnen oder
mit in dieses Thema packen?
 
Danke für die Rückmeldung. Ich habe nämlich auch schonmal bei Büchern solche Art von Fehlern entdeckt. Wenn es um etwas anderes geht als abstrakte klassen würde ich ein neues Thema vorschlagen.
 
Also funktionieren würde das schon, aber ob das zielführend ist:
Java:
abstract class Ausgabe {
  
  private int fehlercode;
  
  public Ausgabe(int x) {fehlercode = x;}
  
  abstract void zeigeFCode();
  
  static class TestAusgabe extends Ausgabe {
  
  
    public TestAusgabe(int x) {
      super(x);
    }
  
    @Override
    void zeigeFCode() {
      System.out.println(super.fehlercode);
    }
  }
}
Achja: Pro Frage ein Thema öffnen bitte!
 
@Flown leider Funktioniert dein Vorschlag nicht.
Folgende Fehlermeldung: Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - fehlercode has private access
 
Das funktioniert aber nur, weil du es als innere Klasse machst. Das würde ich in dem Konkreten Fall aber ablehnen.
 
@Flown wie könnte ich die Methoden von Textausgabe denn testen? Ich kann ja keine neue Textausgabe erstellen und auf die Methoden habe ich auch keinen Zugriff.

Edit: Hat sich erledigt ich müsste zusätzlich eine Methode in Ausgabe schreiben die fcodeAnzeigen von Textausgabe aufruft. Ganz schön kompliziert und unnötig
 
In NetBeans fragt er dich z.B. wenn du einen Compilerfehler hast ob er das Programm dennoch starten soll wenn du auf diesen grünen Play-Button klickst. Schon erhältst du diese Exception. Wird wohl bei Eclipse irgendwie auch gehen

Edit:
Ach so, hatte ich vergessen zu erwähnen: nur wenn dieses fehlerhafte Codestück auch durchlaufen wird.
 
Achso, wenn er quasi im Debugger nach/neukompiliert?

Wäre es aus ExceptionHandling-Sicht aber in dem Fall eigentlich nicht schöner, einen CompileError zu werfen anstatt net RuntimeException?
RuntimeExceptions werden für gewöhnlich öfters mal gefangen... Und ob man Compiler-Fehler irgendwo fangen sollte, ist Geschmakssache 😉
 
Achso, wenn er quasi im Debugger nach/neukompiliert?

Wäre es aus ExceptionHandling-Sicht aber in dem Fall eigentlich nicht schöner, einen CompileError zu werfen anstatt net RuntimeException?
RuntimeExceptions werden für gewöhnlich öfters mal gefangen... Und ob man Compiler-Fehler irgendwo fangen sollte, ist Geschmakssache 😉
Nein, der Code wird einfach nicht kompiliert und stattdessen fügt der Compiler da die Exception ein 😉

Ist ein Feature des Eclipse-Compilers, der normale macht das nicht - und sollte man auch zum endgültigen Kompiliere nicht nutzen.
Ist zum Testen aber oftmals ganz praktisch, weil eben nicht der ganze Code stehen muss.

Fängt man solche Exceptions ganz generell und zeigt sie nirgends, macht man irgendwas gewaltig falsch 😉
 

Zurück
Oben