Heritage - Java

Fermé
TOTO25 - Modifié le 8 nov. 2019 à 09:28
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 9 nov. 2019 à 09:18
Bonjour,

Je voudrais appliquer l’héritage afin que les classes Cercle et Carré héritent à la fois de Forme et Resizable.
Merci d'avance!

voici le code :
**Modifié par la modération pour une lecture plus facile du code, à l'avenir utilisez les balises, VOIR CETTE PAGE
public class Cercle {
    
    double diametre = 0;
    
    public Cercle(double taille) {
        this.diametre = diametre;
    }
    
    public double getPerimeter() {
        return  Math.PI * diametre;
    } 
    
    public void resize(double diametre) {
        this.diametre = diametre
    }
    
}

public class Carre {
    
    double taille = 0;
    
    public Carre(double taille) {
        this.taille = taille;
    }
    
    public double getPerimeter() {
        return taille*4;
    } 
    

     public void resize(double taille) {
         this.taille = taille;
     }
    
}

public abstract class Resizable {
    
    public abstract void resize(double d);
    
}

public abstract class Forme {
    
    public abstract double getPerimeter();
}

**Modifié par la modération pour une lecture plus facile du code, à l'avenir utilisez les balises, VOIR CETTE PAGE

.
A voir également:

1 réponse

Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928
8 nov. 2019 à 07:11
Bonjour

Pour tes prochains posts, merci de lire et appliquer ce petit tuto https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Je ne suis pas spécialiste en java, j’ai donc vérifié avant de te répondre.
Il n’y a pas d’héritage multiple en Java, il faut utiliser au moins une interface.
Dans ton cas, forme et resizable peuvent sans problèmes être toutes 2 des interfaces car elles n’ont aucun code.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié le 8 nov. 2019 à 07:49
Bonjour,

Bien vu pour l'héritage multiple ;-)
En revanche il pourrait exister une alternative, c'est que la classe Forme hérite de la classe Resizable.

Remarque : en terme de nommage, il vaut mieux tout mettre en une seule langue (anglais de préférence)
public class Sizable {

    private double size;

    public Sizable(double size) {
        this.size = size;
    }

    public void setSize(double size) {
        this.setSize(size);
    }

    public double getSize() {
        return size;
    }
}

public abstract class Shape extends Sizable {

    public Shape(double size) {
        super(size);
    }

    public abstract double getPerimeter();
}

public class Circle extends Shape {

    public Circle(double diameter) {
        super(diameter);
    }

    @Override
    public double getPerimeter() {
        return Math.PI * getSize();
    }
}

public class Square extends Shape {

    public Square(double side) {
        super(side);
    }

    @Override
    public double getPerimeter() {
        return 4 * getSize();
    }
}
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928
8 nov. 2019 à 08:49
Je suppose que c’est pour respecter la norme uml?
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015 > Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024
8 nov. 2019 à 14:28
Qu'est-ce qui serait pour respecter la norme UML ? Rien de ce que j'ai dit ne serait justifié par ça en tout cas ;-)
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928
8 nov. 2019 à 14:38
Le fait qu’il n’y a pas d’héritage multiple
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015 > Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024
Modifié le 8 nov. 2019 à 15:01
Un des postulats de base de Java était de ne pas reprendre les concepts du C++ qui amenaient de la confusion. L'héritage multiple en fait partie, de même que les pointeurs, ou les surcharges d'opérateurs.

Toutefois on peut faire de l'héritage multiple en Java, via les interfaces.
Mais c'est de l'héritage multiple de code, pas d'objets.

Exemple :
interface AB {
    default String a() {
        return "AB.a";
    }

    default String b() {
        return "AB.b";
    }
}

interface AC {
    default String a() {
        return "AC.a";
    }

    default String c() {
        return "AC.c";
    }
}

interface X extends AB, AC {
    @Override
    default String a() {
        return AB.super.a(); // ou AC.super.a() ou autre
    }
}

À la compilation, Java plantera si l'interface X ne surcharge pas la méthode a() car il ne saura pas s'il faut prendre la version de AB (ce que j'ai fait), celle de AC, ou autre chose.
En revanche dans X la méthode b() sera celle de AB et la méthode c() sera celle de BC.
0