Héritage et constructeur non vide

a marqué ce sujet comme résolu.

Je début en Java et j'ai un code tout bête qui me renvoie une erreur. J'ai une classe qui hérite d'une autre qui ne possède qu'un seul constructeur a deux paramètres. Après c'est peut-être "normal" en java.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public class Pp
{
    protected int x;
    protected int y;

    public Pp(int x, int y)
    {
        this.x=x;
        this.y=y;
    }
}
1
2
3
public class Pointt extends Pp
{
}

et quand j'exécute javac Pointt.java Pp.java

ça me répond :

1
2
3
4
5
6
7
Pointt.java:3: error: constructor Pp in class Pp cannot be applied to given types;
public class Pointt extends Pp
       ^
  required: int,int
  found: no arguments
  reason: actual and formal argument lists differ in length
1 error

La solution que j'ai trouvée pour éviter cette erreur est de définir un constructeur vide pour Pp ce que je n'ai pas envie de faire…

C'est normal. Bon je suis pas un pro de Java mais ta classe Pointt ne définissant rien, il ne sait pas comment il va pouvoir construire l'objet de base. Comment veux tu que en construisant l'objet Pointt il sache quels paramètres ils doit passer au constructeur de base ?

Ce que tu voudrais peut être est qu'il y ai la possibilité d'hérité du constructeur, c'est à dire spécifier que l'on ne veut rien de plus que le constructeur de la classe de base. C'est possible en C++11 par exemple, cela ne l'est pas en Java. Tu ne semble pas avoir d'autres choix que de redéfinir un constructeur dans Pointt ou créer un constructeur sans arguments dans Pp

Comme l'a dit Kje, en Java les constructeurs ne sont pas hérités.

Ils ont considéré que les classes filles ne doivent pas hériter des constructeurs de la classe mère. Et en réalité, tu verras que souvent les constructeurs des classes filles sont différents des classes mères.

Si les constructeurs étaient hérités, on se retrouverait avec un petit soucis embêtant. Toutes les classes Java dérivent de la classe Object comme tu as du l'apprendre. Or Objectdispose d'un constructeur par défaut : Object obj = new Object(). Ce qui fait que toutes les classes auraient un constructeur par défaut… Dans ton cas, tu pourrais instancier un point sans x ni y… Un peu ennuyeux.

Même si ça ne doit pas être le comportement par défaut que d'hériter un constructeur, dans certains cas comme l'a dit Kje on en aurait bien envie. Pour ceux que ça intéresse : certains langages dérivés de Java le font. C'est le cas de Groovy où tu peux utiliser l'annotation @InheritConstructors

+0 -0

Et quand tu feras ton constructeur Pointt, il faudra explicitement appeler le constructeur de la classe mère en première ligne

1
2
3
4
5
public class Toto{
    public Toto(int a, char b){
        // Un tas d'instruction
    }
}
1
2
3
4
5
6
public class Tata extends Toto{
    public Tata(String abc){
        super(5,2);
        // Un tas d'instruction
    }
}

Super est le contructeur de la classe mère. J'ai fait cet exemple pour que tu comprennes bien que tu n'es pas obligé d'avoir les même paramètres dans le constructeur. Si par exemple du décide de faire des coordonnées aléatoire, ça ne sert à rien de mettre les variables qui définissent l'abscisse et l'ordonnée puisque tu vas les générer aléatoirement :)

Ok merci, c'est bien ce que j'avais conclu aussi, que Java permet pas l'héritage des constructeurs.

J'aurai bien voulu parce que à côté je modifie les méthodes et je rajoute des attributs. Enfin c'est pas grave, du coup je crée juste un constructeur qui appelle super(x,y) même si c'est un peu moche.

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