attribut statique et héritage

Le problème exposé dans ce sujet a été résolu.

Bonjour à tous ! Alors, j’ai un petit soucis en java : Je veux faire une classe abstraite Forme dont héritent Rectangle et Triangle, avec un attribut statique, le nombre de points qui varie entre les rectangles et les triangles :

abstract class Forme {
        [...]
    static int nombreAutresPoints;
        [...]
    public Forme( ~ ) {
        autrePoint = new Dimension[nombreAutresPoints];
    }
class Rectangle( ~ ) {
    nombreAutresPoints = 3;
    public Rectangle( ~ ) {
        super( ~ );
}

Et du coup j’aimerais avoir directement le tableau d’autres points créé à la bonne taille. Je ne peux donc pas mettre nombreAutresPoints dans le constructeur (puis c’est statique au niveau de la forme). Bref, ça marche pô et j’arrive pas à voir comment le faire sans énerver mon compilateur. Je m’y prends mal ?

Merci d’avance de votre aide :)

+0 -0

Salut,

Je dirai que nombreAutresPoints ne doit pas être statique. Un attribut ou une méthode statique ne sont pas liés à une référence, mais uniquement à une classe. Ce qui veut dire que ton attribut/ta méthode ne sera pas lié aux instances en héritant : ça ne peut pas marcher.

Ici, la solution la plus simple que je vois, c’est de mettre nombreAutresPoints en private final, et tu fais passer ton nombre de points en constructeur.

abstract class Forme {
        [...]
    private final int nombreAutresPoints;
        [...]
    public Forme( int nbPoints ) {
        nombreAutresPoints = nbPoints;
        autrePoint = new Dimension[nbPoints];
    }
}

class Rectangle( ~ ) {
    public Rectangle( ~ ) {
        super(3, ...);
}

Le final, c’est uniquement pour dire que ton nombre de points n’évoluera pas une fois ton objet construit, et le private pour qu’il ne soit pas modifié par les classes qui hérite de Forme. Si tu as plusieurs constructeurs, tu seras obligé d’initialiser le nombre de point systématiquement. J’espère que j’ai été claire.

Bon courage !

+0 -0

ah, j’avais pas pensé à le faire passer en constructeur ! Du coup ça devrait marcher merci :)

Ceci dit, niveau "philosophie", le fait d’avoir 3 points en plus de l’origine n’est pas lié à un objet rectangle mais à la classe rectangle… Du coup il est bien lié à la classe et non à l’instance, et donc statique. Mais bon, pas certain que ce soit très important au final.

Merci encore de ta réponse

Alors, oui. Sauf que le nombre de points est lié à la classe Rectangle, indépendamment de son arbre d’héritage, donc Forme ne pourra pas connaître l’attribut.

Et si tu met un attribut statique dans Forme, il ne pourra pas varier en fonction de l’implémentation, vu que tu aura au moins deux valeurs différentes à cet attribut (valeur donnée par Rectangle et par Triangle), c’est pour ça que les attributs statiques ne fonctionnent pas ce cas là.

Pour info, tu aurai pu faire compiler ton programme si dans Rectangle tu avais mis dans ton constructeur :

    Forme.nombreAutresPoints = 3;

Sauf que si ensuite tu fais pareil dans la classe Triangle… Ça sera le dernier objet construit qui aura raison, vu que cette ligne écrase la valeur précédente. Tu vois ce que je veux dire ?

La solution que je t’ai donné est la plus souvent implémentée pour ce type de problème. ;)

N’hésite pas si tu as d’autres questions, et tu peux aussi passer ton sujet en résolu si tout est ok pour toi.

Bon courage !

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte