8.    Réutilisation des classes - Composition

Réutilisation des classes - on utilise des classes construites et testées par quelqu'un d'autre sans modifier le code existant.
Deux approches pour réaliser la réutilisation - Composition et Heritage
Composition - on crée des objets des classes existantes à l'intérieur de la nouvelle classe. On peut aussi créer des nouvelles classes à l'intérieur de la classe.

8.1    Les objets membres


public class Point {
    private double x, y ;
    public Point(double x, double y){
        System.out.println("Constructing a point");
        this.x = x ;
        this.y = y ;
    }   
    public String  toString(){
        return "Point: (" + x + "," + y+")" ;
    }
    public void move(double dx, double dy){
        System.out.println("Moving the point");
        x+=dx;
        y+=dy;
    }
}
public class Test {
    public static void main(String[] arg){
        Point p1 =new Point(5.4,3.6);
        System.out.println(""+p1);
        p1.move(1.1, 2.3);
        System.out.println(""+p1);
    }
}

public class Circle {
    private Point c;        // center
    private double r;            // radius 
    public Circle(double x, double y, double r){
        System.out.println("Constructing a circle");
        c = new Point(x,y);
        this.r =r;
    }
    public String toString(){
        return "Circle - center: "+c+" and radius:"+r;
    }   
    public void move(double dx, double dy){
        System.out.print("moving the circle  ");
        c.move(dx, dy);       
    }
}

public class TestCrcl {
    public static void main(String arg[]){
        Circle cr = new Circle(9.3,8.2,17.1);
        System.out.println(""+cr);
        cr.move(3.1, 4.0);
        System.out.println(""+cr);
    }
}

8.2    Les classes internes

class External {                    // définition d’une classe usuelle (dite alors externe)
    .....                         // méthodes et données de la classe External
    class Internal {            // définition d’une classe interne à la classe External
        .....                     // méthodes et données de la classe Internal
    }
    .....                         // autres méthodes et données de la classe External
}

La définition de la classe Internal n’introduit pas de membre de type Internal dans External. On peut l'utiliser  pour instancier un ou plusieurs objets de ce type:

class External {                   
    public void f() {                            // méthode de External
        Internal i = new Internal() ;         // création d’un objet de type Internal ; sa référence est
                                                // ici locale à la méthode f()    
    }                   
    class Internal {           
        .....                    
    }
    private Internal  i1, i2 ;                 // les champs i1 et i2 de External sont des références
                                                // à des objets de type Internal
    .....                                         // autres méthodes et données de la classe External
}


Exemple:

public class Circle {
    public  static class Point {   //inner class, can be made private or static 
                     // if static the standalone object can be created (outside any Circle)           
        private double x, y ;
        public Point(double x, double y){
            System.out.println("Constructing a point");
            this.x = x ;
            this.y = y ;
        }  
        public String  toString(){
            return "Point: (" + x + "," + y+")" ;
        }
        public void move(double dx, double dy){
            System.out.println("Moving the point:"+dx+","+dy);
            x+=dx;
            y+=dy;
        }
    }
    private static Point c;        // center,  if static - concentric circles
                                   // test it without 'static'
    private double r;            // radius
    public Circle(double x, double y, double r){
        System.out.println("Constructing a circle");
        c = new Point(x,y);
        this.r =r;
    }
    public String toString(){
        return "Circle - center: "+c+" and radius:"+r;
    }  
    public void move(double dx, double dy){
        System.out.print("moving the circle - ");
        c.move(dx, dy);      
    }
}

-------------------------------------------------------

public class TestCrcl {
    public static void main(String arg[]){
        Circle cr = new Circle(9.3,8.2,17.1);
        System.out.println("cr:"+ cr);
        Circle cr1=new Circle(1,2,3);   //if the member c is static - concentric circles
        System.out.println("cr:"+cr+"\n"+ "cr1:"+cr1);
        System.out.println();
        cr.move(3.1, 4.0);
        System.out.println("cr:"+cr+"\n"+"cr1:"+cr1);
        System.out.println();
        Circle.Point p=new Circle.Point(3, 5);   //class Point must be static and accessible
        System.out.println(""+p);                     //new point outside any circle     
    }
}