2010-10-16 10 views
2

Je travaille sur une feuille d'exercices concernant les interfaces, les génériques et les classes abstraites en Java. Peu importe de quelle manière je semble le coder, la classe Exercise1 ne fonctionnera pas. Les questions posées sont commentées dans le code. Toute aide serait appréciée, je ne suis pas sûr si l'erreur est dans le code de l'exercice 1 ou la mise en œuvre de l'interface dans les classes Temps et Point.Problème avec les interfaces en Java

/*Exercise 2 

(a)  Write an interface Printable which has a single method put whose intention is to display a string representation of any object whose class implements Printable. Check it by compiling it. */ 

interface Printable { 

     public void put(Object o); 

} 

/*(b) Enhance classes Point and Time from Chapter 2 of the notes to implement Printable. Check them by compiling them. */ 

class Point implements Printable { 

     static Scanner sc = new Scanner(System.in); 

     private double x, y; // coordinates 

     Point(double x, double y){ // all-args constructor 
      this.x = x; this.y = y; 
     } 

     Point(){}; // no-args constructor (defaults apply) 

     void get() { 
      x = sc.nextDouble(); 
       y = sc.nextDouble(); 
     } 

     public String toString() { 
       return "(" + x + "," + y + ")"; 
     } 

     double distance(Point r) { // distance from r 
       double xdist = x-r.x; double ydist = y-r.y; 
       return(Math.sqrt(xdist*xdist+ydist*ydist)); 
     } 

     public void put(Object o) { 

       if(o==null) return; 
       Point p = (Point)o; 
       System.out.println(x + ":" + y); 
     } 

} 


class Time implements Order, Printable { 

     private int hours; // 0..23 
     private int mins; // 0..59 


     Time() { } 

     Time (int hours, int mins) { 

       this.hours = hours; 
       this.mins = mins; 

     } 

     public boolean lte(Object other) { // Note public 
      if (other==null) return false; 
      Time t = (Time) other; 
      return hours*60+mins<=t.hours*60+t.mins; 
     } 

     public void put(Object o) { 

       if(o==null) return; 
       Time t = (Time)o; 
       System.out.printf("%02d:%02d\n", t.hours, t.mins); 
     } 
} 

/*(c) Write a static method print which takes an array of objects whose class implements Printable, and prints each element in the array, one element per line. Check it by placing it in an otherwise empty class and compiling it. */ 

//this is the bit that is giving me grief, I've tried : 

public class Exercise1 { 

     static void print(Printable[] a) { 

     for(int i = 0; i < a.length ; i++) { 

       a[i].put(); // put(java.lang.Object) in Printable cannot be applied to()             //a[i].put(); 


       } 

     } 

     public static void main(String[] args) { 

       Time[] t = new Time[10]; 
       for(int i = 0; i < t.length; i++) { 
         t[i] = new Time(); 
       } 
       print(t); 

     } 
} 

public interface Order { 
    boolean lte (Object obj); // Object for max generality 
    // is this object less than or equal to obj? 
} 
+0

+1 pour contrer, c'est une question légitime –

Répondre

0

Ce que vous voulez faire est de rendre l'interface Printable ressemble à quelque chose comme ceci:

interface Printable { 

    public void print(); //The name of the method should be similar to the name of the interface 
} 

Ensuite, vos classes fonctionneront comme ceci:

public class Time implements Printable { 

    private int hours, minutes; 

    public void print() { 
     System.out.println(hours + ":" + minutes); 
    } 
} 

Pour l'exercice 1, vous appelleriez alors print() pour chaque élément du tableau. Par ailleurs: Il existe déjà une interface similaire à Order. Il est appelé Comparable, et il ressemble à ceci:

public interface Comparable<T> { 

    public void compareTo(T other); //Returns -1 if less than, 0 if equal, and 1 if greater than other object. 

} 

Si aucun paramètre T est donné, il devient Object.

1

Vous voulez imprimer this, pas un objet arbitraire o.

0

Vous pouvez souhaiter que votre méthode imprimable soit imprimée (Objet Objet), sans être mise.

1

Je pense que le problème est l'interface imprimable. Cela ne correspond pas à la question correctement.

pour afficher une représentation de chaîne d'un objet dont la classe implémente imprimable

Cela ne signifie pas que la méthode put() doit avoir un paramètre de type Object.

L'objet fait ici référence à this, l'objet qui classe implémente Printable. Et la méthode put() devrait imprimer une représentation sous forme de chaîne de this. Donc, dans le cas le plus simple, vous pouvez l'implémenter avec l'aide de toString().

interface Printable { 
    /** 
    * Display a string representation of this 
    */ 
    void put(); 
} 

class Point implements Printable { 

    // ... 

    /** 
    * returns a string representation of this 
    */ 
    public String toString() { 
    return "(" + x + "," + y + ")"; 
    } 

    public void put() { 
    // this is the same as System.out.println(this.toString()); 
    System.out.println(this); 
    } 
} 

Ensuite, vous pouvez appeler put() pour chaque Printable dans votre tableau.