Vererbung Vererbungen

nub12

Mitglied
Hallo Leute,
ich bin gerade dabei ein Vererbungsbeispiel zu lösen und bin da am Verzweifeln.
Es geht hier konkret um dieses Beispiel:
http://griesmayer.com/content/Java/Semester_2/10_Collection/Uebung_Hotel.pdf

Ich bin zur Zeit etwas verwirrt was die Struktur angeht, mein Plan war es die Klasse Zimmer zu einer abstrakten Klasse zu machen, und die Klasse Arbeiterzimmer und Hotelzimmer würden dementsprechend die Eigenschaften von der abstrakten Klasse Zimmer vererbt bekommen.

Nun gibt es in der Klasse Arbeiterzimmer z.Bsp. die Methode "preisMonat", ich frage mich ob ich diese Methode

-) als static methode im Zimmer (private static double preisMonat = 500)

-) als Interface welche ich dann in die Klasse Zimmer implementiere

-) als static Methode in der eigenen Klasse (also Arbeiterzimmer)

einbauen muss.

Und was noch fraglich ist, es gibt in der Klasse Hotelzimmer die Eigenschaft "bettenBelegt", dieser Wert soll 2 sein, aber es wäre doch unlogisch eine static Methode hier einzubauen, da ja nicht immer 2 Betten belegt sind, oder?

Was ich mich noch frage ist, haben die Klassen Arbeiterzimmer und Hotelzimmer keine eigenen Eigenschaften?

Bekommen sie diese nur von der Klasse Zimmer vererbt?

Außerdem steht in der Angabe auch nicht ob die Klasse Arbeiterzimmer, Hotelzimmer und Hotel einen Konstruktor benötigen, was ja eigentlich sein muss, denn ich müsste ja mit der super Methode die Eigenschaften der Klasse Zimmer übernehmen.

Die Angabe erscheint mir leider relativ ungenau, ich wäre daher jeden sehr dankbar der mir dabei helfen könnte.
Als "Code Vorbild" nehme ich die hochgeladene Datei, das haben wir gemeinsam mit dem Professor erarbeitet.

Ich habe in 10 Tagen eine Prüfung und stehe daher etwas unter Druck.:D

Vielen Dank für die Hilfe!
 

Anhänge

  • VER.zip
    7 KB · Aufrufe: 4

JStein52

Top Contributor
Nun gibt es in der Klasse Arbeiterzimmer z.Bsp. die Methode "preisMonat", ich frage mich ob ich diese Methode

-) als static methode im Zimmer (private static double preisMonat = 500)

-) als Interface welche ich dann in die Klasse Zimmer implementiere

-) als static Methode in der eigenen Klasse (also Arbeiterzimmer)

einbauen muss.

Weder noch. Generell sehe ich hier von static weit und breit nichts.
Arbeiterzimmer und Hotelzimmer haben doch eigene Eigenschaften. Sie implementieren jeweils eigen Methoden toString(), preisNacht(), preisMonat() und buchen() ... du kannst diese Methoden aber in Zimmer abstract definieren.
Ansonsten ist das doch straight forward aus dem Klassendiagramm runter zu programmieren.
Es steht doch alles da.
 

HarleyDavidson

Bekanntes Mitglied
Ich bin zur Zeit etwas verwirrt was die Struktur angeht, mein Plan war es die Klasse Zimmer zu einer abstrakten Klasse zu machen, und die Klasse Arbeiterzimmer und Hotelzimmer würden dementsprechend die Eigenschaften von der abstrakten Klasse Zimmer vererbt bekommen.
Halte ich auch für eine gute Idee. Die meisten Methoden, die sich alle Zimmerarten teilen, sind ja eigentlich getter und setter. Die kannst du in eine abstrakte Klasse Zimmer packen. So werden die anderen Zimmerarten wesentlich übersichtlicher.

Nun gibt es in der Klasse Arbeiterzimmer z.Bsp. die Methode "preisMonat", ich frage mich ob ich diese Methode
-) als static methode im Zimmer (private static double preisMonat = 500)
-) als Interface welche ich dann in die Klasse Zimmer implementiere
-) als static Methode in der eigenen Klasse (also Arbeiterzimmer)
einbauen muss.
Eine statische Methode / Variable ist nur sinnvoll, wenn ich kein Objekt der Klasse benötige. Dies ist hier in keinem Fall so, denn es ist nicht gesagt (wie du ja auch bemerkt hast, die Beschreibung deines Profs sind etwas schwammig, bzw. lassen Spielraum für Interpretationen) dass jedes Zimmer immer gleich kostet. Du kannst die Variable aber mit dem Wert setzen, wenn beim Konstruktor kein anderer Wert übergeben wurde. So ist sichergestellt, dass kein Zimmer "kostenlos" ist.
Siehe Seite 2: Da sind die Methoden, die neue Zimmerobjekte erstellen. Hier siehst du, dass du den Preis dann auch setzen musst.

Und was noch fraglich ist, es gibt in der Klasse Hotelzimmer die Eigenschaft "bettenBelegt", dieser Wert soll 2 sein, aber es wäre doch unlogisch eine static Methode hier einzubauen, da ja nicht immer 2 Betten belegt sind, oder?
Gleicher Fall wie oben. Dein Prof hat hier wahrscheinlich den Wert hingeschrieben, damit die Aufgaben weiter unten funktionieren.

Was ich mich noch frage ist, haben die Klassen Arbeiterzimmer und Hotelzimmer keine eigenen Eigenschaften?
Bekommen sie diese nur von der Klasse Zimmer vererbt?
Die vier Methoden sind in der Klasse Zimmer abstrakt und werden in Arbeits- und Hotelzimmer dann implementiert.

Außerdem steht in der Angabe auch nicht ob die Klasse Arbeiterzimmer, Hotelzimmer und Hotel einen Konstruktor benötigen, was ja eigentlich sein muss, denn ich müsste ja mit der super Methode die Eigenschaften der Klasse Zimmer übernehmen.
Siehe Seite 2 mit den Aufgaben. Hier siehst du die Konstruktoren.

Ich hoffe mit diesen Anhaltspunkten kommst du bei deiner Aufgabe weiter!
Kannst ja deine Fortschritte posten.
 

nub12

Mitglied
Hallo Leute,
vielen Dank für eure Antworten!
Ich habe es geschafft diese korrekt zu implementieren, nun hackelt es schon an Aufgabe 1:
http://griesmayer.com/content/Java/Semester_2/09_Vererbung/Uebung_Hotel.pdf
:
"Die Methode ausbauen(...) hängt ein neues Arbeiterzimmer am Ende des Arrays an.
public void ausbauen(boolean dusche, int betten, boolean frei, double preisMonat)"

Ich kann zwar am Ende der Arraylist etwas einfügen, aber nur so:
Code:
 public void ausbauen(Zimmer neu)
    {
        zimmer.add(neu);
    }

Ich müsste es aber mit diesen Parametern machen, mir fällt dazu nichts ein, kann mir da wer helfen?

Code:
import java.util.*;

public class Hotel
{
    private double buchungsgebuhr;
    private ArrayList <Zimmer> zimmer;
   

    public Hotel()
    {   
        zimmer = new ArrayList<Zimmer>();
        setBuchungsgebuhr(20);
    }
   
    public void ausbauen(boolean dusche, int betten, boolean frei, double preisMonat)
    {
        
    }

    public Hotel(double buchungsgebuhr)
    {
        setBuchungsgebuhr(buchungsgebuhr);
    }

    public void setBuchungsgebuhr(double buchungsgebuhr)
    {
        this.buchungsgebuhr = buchungsgebuhr;
    }

    public double getBuchungsgebuhr()
    {
        return buchungsgebuhr;
    }
   
    @Override
    public String toString()
    {
        return "Hotel [buchungsgebuhr=" + buchungsgebuhr + ", zimmer=" + zimmer + "]";
    }
   
   
   
  
   
   
}
 
X

Xyz1

Gast
overrideable method call in constructor - fang da an ;)
 
Zuletzt bearbeitet von einem Moderator:

JStein52

Top Contributor
Ich denke er meint sowas:
Code:
    public void ausbauen(boolean dusche, int betten, boolean frei, double preisMonat)
    {
      zimmer.add(new  Zimmer(dusche, betten, frei, preisMonat);
    }
und in Zimmer einen Konstruktor mit diesen Parametern
 

nub12

Mitglied
Hey Leute,
ich habe es so hinbekommen:
Code:
  public void ausbauen(boolean dusche, int betten, boolean frei, double preisMonat)
    {
        Zimmer neu;        
        neu = new Arbeiterzimmer(dusche, betten, frei, preisMonat);
        zimmer.add(neu);
       
       
    }

Kann man das so durchgehen lassen?
 

nub12

Mitglied
Danke für eure wertvollen Tipps!

So, jetzt mache ich mich an die nächste Aufgabe:

"Die Methode berechneTagesumsatz() berechnet den Tagesumsatz. Bei einem Arbeiterzimmer muss der Monatspreis durch 30 dividiert werden; es sind immer alle Betten belegt! Es können nur belegte (nicht frei!) verrechnet werden!
public double berechneTagesumsatz()"

Irgendwelche Tipps?

Die Frage ist halt, ich müsste ja eine Schleife einbauen die alle Arbeiterzimmer durchgeht, und mit einem If Parameter diejenigen aussortieren die besetzt sind, nur wie mache ich das?
 
Zuletzt bearbeitet:

nub12

Mitglied
Hallo,
tut mir Leid für den Doppelpost, aber ich kann meinen Beitrag oben leider nicht editieren.
Ich wollte noch dazuschreiben dass ich die Schleife so halb geschafft habe:

Code:
public double berechneTagesumsatz()
   {
       double sum;
  
       sum = 0;
     
       for (Zimmer z : zimmer)
       {  
           if (z.getFrei()== false)
           {
             
             
           }
        
       }
     
       return sum;
   }

Ich müsste wissen wie ich, wenn ich z.Bsp. 3 Zimmer habe, hier den Preis berechne, also z.Bsp Zimmer A hat 40 Euro, Zimmer B 30 Euro und Zimmer C 50 Euro, wie kann ich das so rechnen dass ich als Endresultat dann dementsprechend 120 Euro habe?
Also einfach den Preis der jeweiligen Zimmern zusammenrechnen.
 

VfL_Freak

Top Contributor
Moin,
Ist doch richtig, was ich geschrieben habe
genau, habe ich ja auch nicht bestritten :p

Wollte nur darauf hinweisen, dass die Deklaration
Java:
public void ausbauen(boolean dusche, int betten, boolean frei, double preisMonat)
{
    Zimmer neu;       
    neu = new Arbeiterzimmer(dusche, betten, frei, preisMonat);
    zimmer.add( neu );
}
reichlich sinnfrei ist, da das Objekt neu außerhalb des Scopes der Methode ausbauen nicht mehr bekannt ist !! :cool:

Gruß Klaus
 

mrBrown

Super-Moderator
Mitarbeiter
Moin,

genau, habe ich ja auch nicht bestritten :p

Wollte nur darauf hinweisen, dass die Deklaration
Java:
public void ausbauen(boolean dusche, int betten, boolean frei, double preisMonat)
{
    Zimmer neu;      
    neu = new Arbeiterzimmer(dusche, betten, frei, preisMonat);
    zimmer.add( neu );
}
reichlich sinnfrei ist, da das Objekt neu außerhalb des Scopes der Methode ausbauen nicht mehr bekannt ist !! :cool:

Gruß Klaus
Mit der Begründung ist alles überflüssig, jeder Scope endet irgendwo...

Solche Variablen haben durchaus ihren Sinn: Lesbarkeit fördern. Grad Anfängern haben es damit leichter...
Schaden tut es ja auch nicht.
 

VfL_Freak

Top Contributor
Moin,

ok ok, ich sehe jetzt erst die Groß- und Kleinschreibung
Java:
Zimmer neu;        
...
zimmer.add(neu);
die ich zuvor überlesen habe .....

Genau aus diesem Grund, sollte man Variablen auch sinnvoll benennen ('myZimmer' o. ä.) und nicht wie die Klasse, nur kleingeschrieben ...

Mea maxima culpa :oops:

Gruß Klaus
 

mrBrown

Super-Moderator
Mitarbeiter
Genau aus diesem Grund, sollte man Variablen auch sinnvoll benennen ('myZimmer' o. ä.) und nicht wie die Klasse, nur kleingeschrieben ...
Mir fällt ehrlich gesagt keine sinnvollere Benennung als zimmer ein, schöner wäre eine vom Singular unterscheidbare Benennnung, aber ein 's' dran hängen klänge ziemlich komisch.

myZimmer ist doch verwirrend, es ist ja nicht mein Zimmer...

Da wäre eher this zu benutzen ratsamer ;)
 
X

Xyz1

Gast
Sie wird an einer Stelle "gesetzt" und an einer Stelle "genutzt". An genau an einer Stelle. Damit ist sie überflüssig. Vielleicht ist es lesbarer. Aber einem Korrektor wird dadurch auffallen, dass Anfänger am Werke waren.

Es lässt sich darüber streiten, ob "Zwischenvariable" wirklich .. richtige Bezeichnung für das Teil ist, aber mir fallen auch noch drei weitere Bezeichnungen dafür ein.

Ich habe es jetzt nicht ausprobiert, aber IDE müsste einmal sagen, "overridable method call in constructor" und "... neu is redundant". ;)

Yeah, die meisten Hints der IDE sind mir bekannt. :)

Helft ihm doch lieber bei der nächsten (Teil-)Aufgabe.
 

mrBrown

Super-Moderator
Mitarbeiter
Ich müsste wissen wie ich, wenn ich z.Bsp. 3 Zimmer habe, hier den Preis berechne, also z.Bsp Zimmer A hat 40 Euro, Zimmer B 30 Euro und Zimmer C 50 Euro, wie kann ich das so rechnen dass ich als Endresultat dann dementsprechend 120 Euro habe?
Also einfach den Preis der jeweiligen Zimmern zusammenrechnen.

Wo ist denn das Problem? Du kannst doch für ein Zimmer den Preis abfragen und musst diese nur aufaddieren?

Sie wird an einer Stelle "gesetzt" und an einer Stelle "genutzt". An genau an einer Stelle. Damit ist sie überflüssig. Vielleicht ist es lesbarer. Aber einem Korrektor wird dadurch auffallen, dass Anfänger am Werke waren.
Na und? Bei deinem Code wird der auch nichts nettes denken...
 

Ähnliche Java Themen

Neue Themen


Oben