OOP Uhr programmieren

Hallo Leute,

habe eine Aufgabe bekommen und habe ein paar Fragen dazu.

Die Aufgabenstellung hab ich auf meine kilu website geladen weil sie zu lang ist für sie hier hinein zu schreiben Willkommen auf Sobchaks Homepage.

Java:
import utilities.*;     /* Ordner der die Klasse TastaturEingabe enthält */

public class Time24{
  private int hour;
  private int minute;
  
  public Time24(int hour, int minute){
    this.hour = hour;
    this.minute = minute;
    normalizeTime();
    
  }
  
  public Time24(){
    minute = 0;
    hour = 0;
  }
  
  public Time24(Time24 time){
    this.minute = time.minute;
    this.hour = time.hour;
  }
  
  public void readTime(int hour, int minute){
    hour = TastaturEingabe.readInt("Bitte Stunden eingeben");
    minute = TastaturEingabe.readInt("Bitte Minuten eingeben");
    normalizeTime();
  }
  
  public void writeTime(){
    System.out.println(this.hour + ":" + this.minute);
  }
  
  public void addTime(int time){
    if(time >= 0)
    {
      this.minute = this.minute + time;
    }
    normalizeTime();
  }
  
  public int getHour(){
    return this.hour;
  }
  
  public void setHour(int hour){
    this.hour = hour;
  }
  
  public int getMinute(){
    return minute;
  }
  
  public void setMinute(int minute){
    this.minute = minute;
  }
  
  public String toString(){
    return  "";
  }
  
  private void normalizeTime(){
    if(this.minute > 59 && this.minute < 119)
    {
      this.minute = this.minute % 60;
      this.hour = this.hour++;
    }
    else if(this.minute > 119)
    {
      this.minute = this.minute % 60;
      this.hour = this.hour + 2;
    }
    
    if(this.hour > 23)
    {
      this.hour = this.hour % 24;
    }
    else if(this.hour < 0)
    {
      System.err.println("FEHLER!");
    }
    
  }
}

Java:
import utilities.*;

public class Timetest{
  public static void main(String[] args){
    Time24 sanfrancisco, frankfurt, melbourne;
    
    sanfrancisco = new Time24(40, 13);
    
    sanfrancisco.writeTime();
    sanfrancisco.getHour();
  }
}

So meine Fragen nun:

  1. Wofür ist der Kopierkonstruktor da?
  2. Wie mache ich das mit der toString Methode. Das verstehe ich nicht. Hab sie jetzt erstmal kompilierbar gemacht, damit das Programm funktioniert
  3. Ist der Quellcode schonmal annehmbar geschrieben?

Hoffe auf Antworten. Danke im Vorraus
 
1) Um ein neues Time24 objekt aus einem alten zu erstellen
2) was verstehst du nicht? Die Methode soll halt die Uhrzeit als String zurückliefern
3) Ja

Deine normalizeTime() methode ist übrigens nicht ganz richtig mit den Minuten, und du hast vergessen normalizeTime() in setHour und setMinute nochmal aufzurufen
 
Danke für deine Antwort.

1) Um ein neues Time24 objekt aus einem alten zu erstellen

Aber warum kann ich die Objekte denn nicht einfach mit
Code:
new
erstellen? Wo liegt denn der tiefere Sinn eines Kopierkonstruktors? Ist er nötig?

2) was verstehst du nicht? Die Methode soll halt die Uhrzeit als String zurückliefern

Aber wie geht das. Kannst du mir ein Beispiel zeigen, was ungefähr auf diesen Quellcode passt. Ich kann ja noch kein Objekt in eine Zeichenkette umwandeln, wenn noch keins da ist. Oder muss ich das Objekt aus dem Kopierkontruktor nehmen?

Deine normalizeTime() methode ist übrigens nicht ganz richtig mit den Minuten, und du hast vergessen normalizeTime() in setHour und setMinute nochmal aufzurufen

Was meinst du mit noch nicht ganz richtig? Ist halt nur für den Anfang nur oberflächlich programmiert. 😀
 
Aber warum kann ich die Objekte denn nicht einfach mit
Code:
new
erstellen?
Machst du doch!?
Wo liegt denn der tiefere Sinn eines Kopierkonstruktors? Ist er nötig?
Nein nötig ist überhaupt nichts, ist nur eine Frage was Sinn macht um eine bestimmte Aufgabenstellung zu lösen

Aber wie geht das. Kannst du mir ein Beispiel zeigen, was ungefähr auf diesen Quellcode passt. Ich kann ja noch kein Objekt in eine Zeichenkette umwandeln, wenn noch keins da ist. Oder muss ich das Objekt aus dem Kopierkontruktor nehmen?
Versteh ich jetzt wiederum nicht - natürlich hast du ein Objekt, sonst könntest du ja nicht toString() aufrufen. Im Prinzip musst du auch nur exakt das selbe machen was du schon in writeTime gemacht hast, darum weiß ich nicht wo du da hängst?

Was meinst du mit noch nicht ganz richtig? Ist halt nur für den Anfang nur oberflächlich programmiert. 😀
Mit nicht ganz richtig meine falsch 😀 (für minuten werte < 120 und >= 180)

PS: deine readTime() methode funktioniert auch nicht korrekt btw.
 
Aber warum kann ich die Objekte denn nicht einfach mit
Code:
new
erstellen? Wo liegt denn der tiefere Sinn eines Kopierkonstruktors? Ist er nötig?
Das neue Objekt wird so oder so mit [c]new[/c] erstellt. Aber wenn die Daten des alten Objekts übernommen werden sollen, kann dieses im Copykonstruktor mitgegeben werden. Ersteres ist einfach schöner als letzteres:
Java:
SomeObject newObj = new SomeObject(oldObj);
Java:
SomeObject newObj = new SomeObject();
newObj.setA(oldObj.getA());
newObj.setB(oldObj.getB());
newObj.setC(oldObj.getC());
Mal ganz abgesehen davon, dass es private Felder geben könnte, auf welche man von aussen gar keinen Zugriff hat, aber man die Möglichkeit bieten will, ein Objekt zu kopieren.
Aber wie geht das. Kannst du mir ein Beispiel zeigen, was ungefähr auf diesen Quellcode passt. Ich kann ja noch kein Objekt in eine Zeichenkette umwandeln, wenn noch keins da ist.
Wie Gasst bereits sagte, ist ein Objekt vorhanden, nämlich dieses, auf welchem [c]toString()[/c] aufgerufen wird. Du kannst dort einfach [c]return hour + ":" + minute;[/c] schreiben. Die Methode [c]writeTime()[/c] kann dann eigentlich auch auf [c]System.out.println(this);[/c] umgeschrieben werden, da [c]println()[/c] nichts anderes macht, also [c]toString()[/c] des übergebenen Objektes aufzurufen und auszugeben.
 
Mit nicht ganz richtig meine falsch (für minuten werte < 120 und >= 180)

PS: deine readTime() methode funktioniert auch nicht korrekt btw.

Ok habs gemerkt. Habs jetzt angepasst. Danke^^.


Das neue Objekt wird so oder so mit new erstellt. Aber wenn die Daten des alten Objekts übernommen werden sollen, kann dieses im Copykonstruktor mitgegeben werden. Ersteres ist einfach schöner als letzteres:
Java:
SomeObject newObj = new SomeObject(oldObj);

Java:
SomeObject newObj = new SomeObject();
newObj.setA(oldObj.getA());
newObj.setB(oldObj.getB());
newObj.setC(oldObj.getC());

Mal ganz abgesehen davon, dass es private Felder geben könnte, auf welche man von aussen gar keinen Zugriff hat, aber man die Möglichkeit bieten will, ein Objekt zu kopieren.

Ach ok. Das habe ich jetzt verstanden. Gute Erklärung danke.

Wie Gasst bereits sagte, ist ein Objekt vorhanden, nämlich dieses, auf welchem
Code:
toString()
aufgerufen wird. Du kannst dort einfach
Code:
return hour + ":" + minute;
schreiben. Die Methode
Code:
writeTime()
kann dann eigentlich auch auf
Code:
System.out.println(this);
umgeschrieben werden, da
Code:
println()
nichts anderes macht, also
Code:
toString()
des übergebenen Objektes aufzurufen und auszugeben.

Ich habe dort viel zu kompliziert gedacht😀. Aber besser man fragt nach^^.

Ok danke. Falls noch weitere Fragen auftauchen melde ich mich wieder.
 

Neue Themen


Zurück
Oben