Classe Complexe avec héritage

Exemple de création d'une classe Réel héritant de Complexe.

/*

 * Main.java
 *
 * Created on March 6, 2008, 10:29 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package complexe;

class Complexe
{
    /* attributs */
    /* un bon conseil: toujours mettre les attributs en "private" */
    private double reel;
    private double imaginaire;

    /**

     * Constructeur de la classe Complexe
     */
    Complexe(double reel, double imaginaire)
    {
        /* attention: à droite: l'argument du constructeur; à gauche: l'attribut (this. ...) 

         * c'est le this qui permet a Java de faire la difference entre les deux
         */
        this.reel = reel;
        this.imaginaire = imaginaire;
    }

    /** accesseur get pour l'attribut reel

     */
    public double getReel()
    {
        return reel; // ici pas besoin de this car il n'y a pas d'ambiguite
    }
    /** accesseur get pour l'attribut imaginaire

     */
    public double getImaginaire()
    {
        return this.imaginaire; // plus long, mais plus clair a lire aussi
    }
    /** accesseur set pour l'attribut reel

     */
    public void setReel(double reel)
    {
        this.reel = reel; // la par contre, oblige ...
    }
    /** accesseur set pour l'attribut imaginaire

     */
    public void setImaginaire(double img)
    {
        this.imaginaire = img; 
    }

    /** 

     * methode qui retourne le complexe conjugue d'un complexe (celui courant auquel s'applique la methode)
     */
    public Complexe conjugue()
    {
        // on cree un nouveau complexe
        Complexe c;
        c = new Complexe(this.getReel(), -this.getImaginaire()); // penser a utiliser directement les accesseurs
                                                                 // plutot que les attributs ...
        return c;
    }

    /*

     * deux facons de faire l'addition de deux complexes:
     * soit a.additionne(b) ou a et b sont deux objets Complexe
     * soit Complexe.addition(a, b)
     * Dans le premier cas, "additionne" est une methode d'objet
     * Dans le deuxieme case, "addition" est une methode de classe (on rajoute le mot-clé "static")
     */

    /**

     * methode d'addition d'un complexe à un autre
     */
    public Complexe additionne(Complexe b)
    {
        Complexe somme;
        somme = new Complexe(this.getReel()+b.getReel(), this.getImaginaire()+b.getImaginaire());
        return somme;
    }

    /**

     * methode de classe d'addition de deux complexes
     */
    static public Complexe addition(Complexe a, Complexe b)
    {
        Complexe somme;
        somme = new Complexe(a.getReel()+b.getReel(), a.getImaginaire()+b.getImaginaire());
        return somme;
    }

    public static Complexe multiplication(Complexe a, Complexe b)
    {
        Complexe mul;

        double x1 = a.getReel();
        double y1 = b.getReel();
        double x2 = a.getImaginaire();
        double y2 = b.getImaginaire();

        mul = new Complexe(x1*x2-y1*y2,x1*y2+y1*x2);
        return mul;
    }

    /**

     * une petite routine pour l'affichage d'un complexe
     * @return une chaine de caractere du type "(reel, imaginaire)"
     */
    public String voir()
    {
       String representation;

       representation = String.format("(%f, %f)", this.getReel(), this.getImaginaire());
       return representation;
    }

}

class Reel extends Complexe
{
    public Reel(double reel)
    {
        /* on construit un reel comme un complexe avec une partie imaginaire nulle

         */
        super(reel, 0.); // appel au constructeur de Complexe
    }

    /**

     * reecriture de multiplication (version simplifiee pour les reels)
     */
    public static Reel multiplication(Reel a, Reel b)
    {
        Reel mul;

        double x1 = a.getReel();
        double y1 = b.getReel();
        mul = new Reel(x1*y1);
        return mul;
    }

    /**

     * reecriture de voir
     */
    public String voir()
    {
        String representation;
        representation = String.format("%f", this.getReel());
        return representation;
    }

    /**

     * valeur absolue (definie seulement pour les objets Reel
     */
    public double valeur_absolue()
    {
        return Math.abs(this.getReel());
    }
}

/**

 *
 * @author gmonard
 */
public class Main
{

    /** Creates a new instance of Main */
    public Main()
    {
    }

    /**

     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        Complexe c1, c2, c3, c4, c5; // definition des types de variables
                                     // attention: elles ne contiennent encore aucune valeur

        c1 = new Complexe(1.0, 2.0);
        c2 = new Complexe(2.0, -5.0);
        c3 = c1.conjugue();
        c4 = c1.additionne(c2);            // noter les differences d'appel entre ces deux lignes
        c5 = Complexe.addition(c1, c2);

        System.out.printf(" c1 = %s\n", c1.voir());
        System.out.printf(" c2 = %s\n", c2.voir());
        System.out.printf(" c3 = %s\n", c3.voir());
        System.out.printf(" c4 = %s\n", c4.voir());
        System.out.printf(" c5 = %s\n", c5.voir());

        Reel r1, r2, r3, r4;
        r1 = new Reel(2.0);
        r2 = new Reel(c2.getImaginaire());
        r3 = Reel.multiplication(r1, r2);
        r4 = new Reel(r1.additionne(r2).getReel()); // utilisation de la methode Complexe heritee
                                                    // et conversion en Reel

        System.out.printf(" r1 = %f", r1.voir());
        System.out.printf(" r2 = %f", r2.voir());
        System.out.printf(" r3 = %f", r3.voir());
        System.out.printf(" r4 = %f", r4.voir());


    }

}