Interfaces (Klausur WS 07/08)

Redhawk
Neuling
Neuling
Beiträge: 7
Registriert: 20. Aug 2008 14:19

Interfaces (Klausur WS 07/08)

Beitrag von Redhawk »

Hi!

Frag einfach mal immer weiter, auch wenn es mir natürlich nie komisch vorkommen würde, dass ich momentan der Einzige bin ^^ ;).

Es geht um die Aufgabe 4 der oben genannten Klausur. Ich finde die Aufgabenstellung ziemlich verwirrend, deswegen bin ich mir öfters nicht so sicher und poste einfach mal die Teilabschnitte und mein "Lösungsansatz" mit meinen Fragen :).

4a/b (sollte eigentlich so stimmen):

Code: Alles auswählen

public abstract class Team
{
  protected static double Punktanzahl;
  public String Name;
  
  public double getPunkte() { return Punktanzahl; }
  public abstract void updatePunkte(Object S);
}
4c (Könnte auch ohne "public" Methoden funktionieren?)

Code: Alles auswählen

public interface Spiel 
{
 public Object heimTeam();
 public Object gastTeam();
 public double gastScore();
 public double heimScore();
}
4d/e/f: Hier gibt es viele Probleme, selbst nach mehreren Tests in BlueJ.
1. Ich gehe bei updatePunkte davon aus, dass es sich um Objekte von Typ "Fußballteam " handelt und "update" nur die vorgegeben Variablen (4e). Wenn ich jetzt noch den Punktestand ändern wollte (der ja in Team abgespeichert ist, muss dieser jedoch static sein, sonst würde das nicht funktionieren, oder? (z.B für einen Sieg 3 Punkte...)
2. Die Methoden in einem Interface dürfen ja keinen Body besitzen, deswegen sind sie doch automatisch abstract und daraus folgt, dass sie nirgends definiert sind. Deswegen bin ich mir unsicher, ob ich sie dann auch aufrufen darf(z.B: S.heimScore(). Bisher hängt der Compiler aber noch an anderen Fehlern, sodass er das bisher noch nicht bemängelt hat :D.
3. Ich bekomme einen Fehler bei der zeile mit "instanceof" in der Methode comareTo, der sagt: "<identifier> expected". Aber so habe ich bisher immer Objekte überprüft. Hab auch schon unsinnige Sachen wie Typecasts probiert, weis nicht, was da falsch sein soll :/.

Code: Alles auswählen

 
public class FussballTeam extends Team 
                                implements Comparable
{
    int Siege;
    int Unentschieden;
    int Tordifferenz;
   
  public void updatePunkte(Object S) {
       if (S.heimScore()>S.gastScore()) S.heimTeam().Siege++;
       if (S.heimScore()==S.gastScore()) {
           S.heimTeam().Unentschieden++;
           S.gastTeam().Unentschieden++;
        }
       if (S.heimScore()<S.gastScore()) S.gastTeam.Siege++;
       int T = S.heimScore()-S.gastScore();
       S.heimTeam().Tordifferenz = T;
       S.gastTeam().Tordifferenz = -T;  
    }
    
  public int compareTo(Object t) throws ClassCastException {
      if(!t.instanceof(FussballTeam)) {
        ClassCastException C = new ClassCastException();
        throw C;
      }
    if (Punktanzahl>t.Punktanzahl) return 1;
    if (Punktanzahl==t.Punktanzahl) return 0;
    return -1;
  }
}
Schonmal danke für die Mühe, kam mit den Antworten bisher echt gut weiter! :)

Gruß
Markus

Benutzeravatar
Bjoern
Mausschubser
Mausschubser
Beiträge: 53
Registriert: 1. Nov 2007 08:39
Wohnort: Darmstadt
Kontaktdaten:

Re: Interfaces (Klausur WS 07/08)

Beitrag von Bjoern »

Hi, ich will dann auch mal wieder :roll:

4 a/b: Punktanzahl würde ich nicht static machen, ich hab das so verstanden das für jedes Team eine eigene Punktzahl gespeichert werden soll. Ansonsten bin ich einverstanden...

4 c: ja, geht auch ohne public.

4 d/e/f - 1: Ich denke davon muss man auch ausgehen, schließlich wird die Methode ja in FussballTeam implementiert. Was den Punktestand angeht, das hab ich anders verstanden - hier würde ich kein static nehmen. Durch das protected müsstest du eigentlich immer noch auf die Variable zugreifen können. Aber ich hab mit updatePunkte noch ein anderes Problem: in der Aufgabenstellung steht ja, sie soll static sein - das geht aber nicht, da sie abstrakt in Team definiert wird.

4 d/e/f - 2: Die Aufgabe kann so nicht ausgeführt werden, wie du schon sagst: du müsstest irgendwo die Methoden aus dem Interface implementieren, um auch wirklich ein Spiel zu "spielen". Bis dahin schweigt der Compiler aber und wird dir diesbezüglich auch keinen Fehler anzeigen.

4 d/e/f - 3: instanceof wird soweit ich weiß wie ein Vergleichoperator eingesetzt, es müsste also heißen

Code: Alles auswählen

if(!(t instanceof FussballTeam ))
Guck mal, ob der Compiler dann Ruhe gibt.

Sag mal bescheid, obs geht :)
Gruß,
Björn
Und mit den Worten "Learning by doing" packte der ETler in die Steckdose.

Redhawk
Neuling
Neuling
Beiträge: 7
Registriert: 20. Aug 2008 14:19

Re: Interfaces (Klausur WS 07/08)

Beitrag von Redhawk »

Bei dem static hab ich noch ein wenig ausprobiert (Punktanzahl von Team in updatePunkte zu verändern), das sollte aber schon protected sein, steht ja auch mehr oder weniger so in der Aufgabenstellung, habs nur vergessen wieder umzuändern :). Beu update Punkte aber hab ich genau das Problem gehabt, was du beschrieben hast, sie darf nämlich nicht static sein, deswegen hab ichs schon weggelassen. Das mit dem instanceof geht! :) Jetzt funzt zwar meine compareTo Methode, allerdings sagt er, dass die Methodenaufrufe von Spiel nicht funktionieren (gleich den ersten Aufruf zeigt er als Fehler an). :/ Wenn ich spiel aber implementieren würde, dann müsste ich doch auch all seine Methoden überschreiben. Soll das vielleicht so gelöst werden?

Benutzeravatar
Bjoern
Mausschubser
Mausschubser
Beiträge: 53
Registriert: 1. Nov 2007 08:39
Wohnort: Darmstadt
Kontaktdaten:

Re: Interfaces (Klausur WS 07/08)

Beitrag von Bjoern »

Ich glaub da hast du auch nur einen Typecast vergessen: Du hast ja im Methodenkopf

Code: Alles auswählen

public void updatePunkte(Object S) { ... }
stehen, benutzt dann S aber wie ein Spiel. Da müsstest du meiner Meinung nach mit einem Typecast auf Spiel weiterkommen, da Object die Methoden von Spiel ja nicht kennen kann.
Und mit den Worten "Learning by doing" packte der ETler in die Steckdose.

Redhawk
Neuling
Neuling
Beiträge: 7
Registriert: 20. Aug 2008 14:19

Re: Interfaces (Klausur WS 07/08)

Beitrag von Redhawk »

Sehr gute Idee, wieder einen Schritt weiter ^^. Allerdings bekam ich dann bei der Variable siege(s.u.) eine Fehlermeldung, als ich dann auch da einen Typecast gemacht habe, verlangt er in der selben Zeile eine Klammer?! Hab ich da wieder Syntaxschwächen? ;)

Code: Alles auswählen

public void updatePunkte(Object o) {
      Spiel S = (Spiel) o;
      if (S.heimScore()>S.gastScore())  (Fußballteam S.heimTeam()).Siege++;

Benutzeravatar
Bjoern
Mausschubser
Mausschubser
Beiträge: 53
Registriert: 1. Nov 2007 08:39
Wohnort: Darmstadt
Kontaktdaten:

Re: Interfaces (Klausur WS 07/08)

Beitrag von Bjoern »

Kurz und schmerzlos: ja :roll:
Der Typecast selber kommt auch in Klammern, deine Zeile sollte also funktionieren, wenn du das hier schreibst:

Code: Alles auswählen

if ( ... )  ((Fussballteam) S.heimTeam()).Siege++;
Was mir da grad noch auffällt... das ß is aber nicht richtig, oder?
Und mit den Worten "Learning by doing" packte der ETler in die Steckdose.

Redhawk
Neuling
Neuling
Beiträge: 7
Registriert: 20. Aug 2008 14:19

Re: Interfaces (Klausur WS 07/08)

Beitrag von Redhawk »

Ups :D, nuja, wenigstens läuft es noch mit vielen Typecaständerungen und vielen Tipps von dir (auch in compareTo) durch den Compiler. So eine Aufgabe wäre allerdings allein durch den Schreibaufwand ungnädig in der Klausur ^^. Nochmals besten Dank! :)

Code: Alles auswählen

public class FußballTeam extends Team implements Comparable
{
   public int Siege;
   public int Unentschieden;
   public int Tordifferenz;
   
  public void updatePunkte(Object o) {
      Spiel S = (Spiel) o;
      if (S.heimScore()>S.gastScore())  ((FußballTeam) S.heimTeam()).Siege++; 
       if (S.heimScore()==S.gastScore()) {
           ((FußballTeam) S.heimTeam()).Unentschieden++;
           ((FußballTeam) S.gastTeam()).Unentschieden++;
        }
       if (S.heimScore()<S.gastScore()) ((FußballTeam) S.gastTeam()).Siege++;
       int T = ((int) (S.heimScore()-S.gastScore()));
       ((FußballTeam) S.heimTeam()).Tordifferenz = T;
       ((FußballTeam) S.gastTeam()).Tordifferenz = -T;  
    }
    
  public int compareTo(Object f) throws ClassCastException {
      if(!(f instanceof FußballTeam)) {
        ClassCastException C = new ClassCastException();
        throw C;
      }
      FußballTeam t = (FußballTeam) f;
    if (Punktanzahl>t.Punktanzahl) return 1;
    if (Punktanzahl==t.Punktanzahl) return 0;
    return -1;
  }
}

frankmertins
Neuling
Neuling
Beiträge: 8
Registriert: 9. Apr 2008 19:34

Re: Interfaces (Klausur WS 07/08)

Beitrag von frankmertins »

Moin,

würde bei der 5 reichen:

a.) Inteface Map, da jedem Team (Schlüssel) Punkte (values) zugeordnet werden

b.) Interface TreeMap, da damit die entsprechenden Ordnungen initialisiert werden können

???

Benutzeravatar
Bjoern
Mausschubser
Mausschubser
Beiträge: 53
Registriert: 1. Nov 2007 08:39
Wohnort: Darmstadt
Kontaktdaten:

Re: Interfaces (Klausur WS 07/08)

Beitrag von Bjoern »

Also, was die sich da genau vorgestellt haben, weiß ich auch nicht, aber ich denke mal in etwa das hier:

a) Ich würde ein TreeSet nutzen. Begründung im Hinblick auf die b):
  • Das Interface Comparable ist implementiert, d.h. ein Aufruf new TreeSet() sortiert die Spiele schon automatisch nach den Punkten (siehe Aufgabe 4).
  • Über das Set kann direkt ein iterator laufen und man kann so sehr einfach die gewünschte Tabelle ausgeben.
Natürlich ginge auch eine TreeMap, nur da kriegst du halt nicht sofort den Iterator.

b) Wir haben die Methode compareTo schon implementiert, d.h. das Set ist sortiert.

Vielleicht kann sich dazu ja auch mal einer der Profis hier äußern, weil da gibt es sicher noch andere Argumente dafür bzw. dagegen...
Und mit den Worten "Learning by doing" packte der ETler in die Steckdose.

Antworten

Zurück zu „Archiv“