OVH Cloud OVH Cloud

Héritage et constructeurs

3 réponses
Avatar
Loic LE BLEIS
Bonjour,

J'ai un probleme de compréhension dans la maniere d'ecrire les constructeurs
lors d'héritage de classes.
Ce sujet a deja ete largement traité dans ce groupe, mais je n'ai pas trouvé
de réponse precise a ma question, donc je m'excuse de re-poster la dessus,
mais j'aimerai comprendre ;) :

Mon probleme :

class MyHashtable extends Hashtable
{
// Aucun constructeur déclaré

// Divers methodes specifiques
....
}

// Dans mon main :

MyHashtable a = new MyHashtable(); // <-- Pas de p

MyHashtalbe b = new MyHashtable(a); // <-- Probleme de compilation

Pour que cela compile il faut declarer dans ma classe MyHashtable les deux
constructeurs. Quelqu'un peut-il m'expliquer ce comportement ? Je comprends
qu'il faille declarer le constructeur par defaut si je declare le
constructeur par recopie, mais je ne comprends pas et ne trouve pas de
reference, au "pourquoi ai-je besoin de declarer le constructeur par recopie
qui existe dans la super classe ?"

Merci d'avance :)

Loic

3 réponses

Avatar
Kupee
Loic LE BLEIS wrote:
Mon probleme :

class MyHashtable extends Hashtable
{
// Aucun constructeur déclaré

// Divers methodes specifiques
....
}

// Dans mon main :

MyHashtable a = new MyHashtable(); // <-- Pas de p

MyHashtalbe b = new MyHashtable(a); // <-- Probleme de compilation

Pour que cela compile il faut declarer dans ma classe MyHashtable les deux
constructeurs. Quelqu'un peut-il m'expliquer ce comportement ? Je comprends
qu'il faille declarer le constructeur par defaut si je declare le
constructeur par recopie, mais je ne comprends pas et ne trouve pas de
reference, au "pourquoi ai-je besoin de declarer le constructeur par recopie
qui existe dans la super classe ?"


On hérite pas des constructeurs tout simplement, on peut les appeler a
partir d'en dessous (c'est même obligatoire pour instantier la classe)
mais on en hérite pas.

Avatar
Emmanuel Bourg
Quelques règles à garder en tête avec les constructeurs :

1. les constructeurs ne sont pas hérités

2. si aucun constructeur n'est déclaré un constructeur par défaut e st
créé à la compilation (sans paramètre)

3. si un constructeur est déclaré le constructeur par défaut n'est plus
automatiquement créé à la compilation

4. tout constructeur d'une sous classe doit appeler un constructeur de
la super classe. Si la super classe dispose d'un constructeur par défau t
cet appel peut être implicite, si la super classe ne dispose pas de
constructeur par défaut l'appel doit être explicite et se trouver ava nt
toute opération effectuée par le constructeur.

Ton problème découle de mon premier point, c'est à dire que
contrairement aux méthodes (non static ni final) les constructeurs ne
sont pas hérités. Tu dois donc définir un constructeur dans ta sous
classe acceptant une Hashtable en paramètre.

Emmanuel


Loic LE BLEIS wrote:

Bonjour,

J'ai un probleme de compréhension dans la maniere d'ecrire les constr ucteurs
lors d'héritage de classes.
Ce sujet a deja ete largement traité dans ce groupe, mais je n'ai pas trouvé
de réponse precise a ma question, donc je m'excuse de re-poster la de ssus,
mais j'aimerai comprendre ;) :

Mon probleme :

class MyHashtable extends Hashtable
{
// Aucun constructeur déclaré

// Divers methodes specifiques
....
}

// Dans mon main :

MyHashtable a = new MyHashtable(); // <-- Pas de p

MyHashtalbe b = new MyHashtable(a); // <-- Probleme de compilation

Pour que cela compile il faut declarer dans ma classe MyHashtable les d eux
constructeurs. Quelqu'un peut-il m'expliquer ce comportement ? Je compr ends
qu'il faille declarer le constructeur par defaut si je declare le
constructeur par recopie, mais je ne comprends pas et ne trouve pas de
reference, au "pourquoi ai-je besoin de declarer le constructeur par re copie
qui existe dans la super classe ?"

Merci d'avance :)

Loic




Avatar
Loic LE BLEIS
Ca y est j'ai compris ;)
Merci pour vos réponses :)

Loïc

"Emmanuel Bourg" a écrit dans le message de news:
bpa4v7$aa8$
Quelques règles à garder en tête avec les constructeurs :

1. les constructeurs ne sont pas hérités

2. si aucun constructeur n'est déclaré un constructeur par défaut est
créé à la compilation (sans paramètre)

3. si un constructeur est déclaré le constructeur par défaut n'est plus
automatiquement créé à la compilation

4. tout constructeur d'une sous classe doit appeler un constructeur de
la super classe. Si la super classe dispose d'un constructeur par défaut
cet appel peut être implicite, si la super classe ne dispose pas de
constructeur par défaut l'appel doit être explicite et se trouver avant
toute opération effectuée par le constructeur.

Ton problème découle de mon premier point, c'est à dire que
contrairement aux méthodes (non static ni final) les constructeurs ne
sont pas hérités. Tu dois donc définir un constructeur dans ta sous
classe acceptant une Hashtable en paramètre.

Emmanuel