Classes abstraites, interfaces et héritage multiple
CHAPITRE 14
290
Il n’est alors plus possible d’instancier des objets de type A. Une expression telle que :
Création A(...)
// erreur
sera rejetée par le traducteur.
En revanche, il reste possible de déclarer des variables de type A (du moins dans les langages
gérant les objets par référence (dans les autres, la seule déclaration entraînerait une instanciation interdite...). À cette variable, on pourra par exemple affecter la référence d’un objet
d’une classe dérivée de A :
classe A1 dériveDe A
{ .....
}
A a
a := Création A(...)
// interdit
a := Création A1(...)
// OK
1.2 Méthodes retardées (ou abstraites)
Pour l’instant, nous avons considéré qu’une classe abstraite disposait classiquement d’attributs et de méthodes, comme n’importe quelle classe. Mais on peut généralement y trouver ce
que l’on nomme des méthodes retardées (ou encore abstraites ou différées). Il s’agit en fait de
méthodes dont on ne fournit que la signature et le type du résultat. N’étant plus définies dans
la classe abstraite, elles devront obligatoirement être définies dans toute classe dérivée pour
que cette dernière permette d’instancier des objets. Nous déclarerons ces méthodes avec le
mot retardée.
classe abstraite B
{ entier méthode f (réel x)
{ ..... }
// définition d’une méthode «usuelle»
caractère méthode retardée g (entier) // méthode retardée : on ne fournit
// que sa signature et le type du résultat
}
Ici, nous avons conservé l’adjectif abstraite pour la classe B. En toute rigueur, une classe
possèdant une méthode retardée est obligatoirement abstraite puisqu’elle ne peut pas être instanciée (il lui manque la définition d’une méthode). Certains langages vous obligeront,
comme ici, à répéter cette propriété, d’autres pas...
Une classe dérivée de B pourra définir ses propres méthodes, redéfinir éventuellement certaines méthodes héritées de A et, surtout, définir convenablement les méthodes déclarées retardées dans B :
class B1 dériveDe B
{ // attributs et méthodes supplémentaires éventuels
caractère méthode g (entier n)
{ ..... }
// définition de la méthode g déclarée retardée dans B
}
CHAPITRE 14
290
Il n’est alors plus possible d’instancier des objets de type A. Une expression telle que :
Création A(...)
// erreur
sera rejetée par le traducteur.
En revanche, il reste possible de déclarer des variables de type A (du moins dans les langages
gérant les objets par référence (dans les autres, la seule déclaration entraînerait une instanciation interdite...). À cette variable, on pourra par exemple affecter la référence d’un objet
d’une classe dérivée de A :
classe A1 dériveDe A
{ .....
}
A a
a := Création A(...)
// interdit
a := Création A1(...)
// OK
1.2 Méthodes retardées (ou abstraites)
Pour l’instant, nous avons considéré qu’une classe abstraite disposait classiquement d’attributs et de méthodes, comme n’importe quelle classe. Mais on peut généralement y trouver ce
que l’on nomme des méthodes retardées (ou encore abstraites ou différées). Il s’agit en fait de
méthodes dont on ne fournit que la signature et le type du résultat. N’étant plus définies dans
la classe abstraite, elles devront obligatoirement être définies dans toute classe dérivée pour
que cette dernière permette d’instancier des objets. Nous déclarerons ces méthodes avec le
mot retardée.
classe abstraite B
{ entier méthode f (réel x)
{ ..... }
// définition d’une méthode «usuelle»
caractère méthode retardée g (entier) // méthode retardée : on ne fournit
// que sa signature et le type du résultat
}
Ici, nous avons conservé l’adjectif abstraite pour la classe B. En toute rigueur, une classe
possèdant une méthode retardée est obligatoirement abstraite puisqu’elle ne peut pas être instanciée (il lui manque la définition d’une méthode). Certains langages vous obligeront,
comme ici, à répéter cette propriété, d’autres pas...
Une classe dérivée de B pourra définir ses propres méthodes, redéfinir éventuellement certaines méthodes héritées de A et, surtout, définir convenablement les méthodes déclarées retardées dans B :
class B1 dériveDe B
{ // attributs et méthodes supplémentaires éventuels
caractère méthode g (entier n)
{ ..... }
// définition de la méthode g déclarée retardée dans B
}
