L'avantage de mot cle abstract

tatsuyad Messages postés 75 Date d'inscription   Statut Membre Dernière intervention   -  
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour.

J'ai lu l'integrite de tutoriel d'openclassroom concernant la notion de abstract.
https://openclassrooms.com/courses/apprenez-a-programmer-en-java/les-classes-abstraites-et-les-interfaces


Alors, j'ai appris que...

1. Avec l'abstract, on peut defendre l'heritage de class.
2. abstract est necessairement defini dans le fichier interface.

Mais, l'exemple de openclassroom n'etait pas tres explicite.
Si on defend l'heritage de class Animal, il n'y a que des inconvenients ! Comment leur fils,beau-fils...la classe Loup(),Perroquet().... peuvent heriter leur methodes ?
A voir également:

1 réponse

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Bonjour,

abstract est necessairement defini dans le fichier interface.
Euh... non ! Ce sont des classes ou ses méthodes qui peuvent être abstract, mais les interface sont un concept à part.

Je t'invite à étudier un exemple concret dans les classes Java :

public final class Integer extends Number implements Comparable<Integer>

Integer est une classe, elle hérite de Number qui est une classe abstraite et implémente Comparable qui est une interface.

Voir dans la documentation :
java.lang.Integer, java.lang.Number, java.lang.Comparable
0
tatsuyad Messages postés 75 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour.

J'étais dans les nuages !

1. Dans la classe abstract, les méthodes qui ne sont pas communes entre toutes ses classes enfant, ne prennent pas de corps.
2. Les méthodes communes entre elles ne prennent pas le mot clè abstract à la tête et dans ce cas, leurs fonctions à réaliser sont explicitement déclarées.

Dans le cas de trois classes que vous m'avez montré, les méthodes "doubleValue(),intValue() ...etc" sont identiques. Et les autres sont vides dans la classe abstract "Comparable".

Merci !
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
1. Dans la classe abstract, les méthodes qui ne sont pas communes entre toutes ses classes enfant, ne prennent pas de corps.
2. Les méthodes communes entre elles ne prennent pas le mot clè abstract à la tête et dans ce cas, leurs fonctions à réaliser sont explicitement déclarées.


Dis comme ça, on a l'air de penser que les méthodes abstraites ne sont pas obligatoires et que la classe concrète pourrait ne pas définir ces méthodes : c'est faux !
Toutes les méthodes (sauf private), y compris les méthodes abstraites, seront disponibles par toutes les classes filles. Les "méthodes communes" c'est donc toutes les méthodes .

Ce qui est abstract, c'est ce qui est spécifique à l'implémentation de la classe concrète, c'est à dire les choses que l'on ne sait pas faire dans la classe abstraite puisque cela va dépendre des spécificités de la classe fille.

Par exemple, la classe abstraite Number peut définir les méthodes byteValue() et shortValue(), en se basant sur la méthode abstraite intValue() :

// class abstract Number

    public abstract int intValue();

    public byte byteValue() {
        return (byte) intValue();
    }

    public short shortValue() {
        return (short) intValue();
    }

Ainsi, la classe Integer a juste à définir la méthode intValue() pour que ces trois méthodes soient utilisables, les deux dernières se déduisant de la première.
NB. En réalité la classe Integer redéfinit quand même ces méthodes pour des questions de performance.

les méthodes "doubleValue(),intValue() ...etc" sont identiques.
Les méthodes doubleValue() et intValue() ne sont certainement pas identiques, si elles l'étaient ça ne serviraient à rien d'avoir deux méthodes au lieu d'une seule...
Par contre doubleValue() et intValue() sont abstraites dans Number parce que leur implémentation va dépendre de classe fille.

La classe Integer extends Number les définira comme ceci :

private final int value,

    public int intValue() {
        return value;
    }

    public double doubleValue() {
        return (double) value;
    }

La classe Double extends Number comme ceci :

private final double value;

    public int intValue() {
        return (int) value;
    }

    public double doubleValue() {
        return value;
    }

Et pour d'autres classes héritant de Number on pourrait avoir beaucoup plus de code pour définir ces deux méthodes, c'est le cas de BigInteger où la méthode doubleValue() fait une quarantaine de lignes.

Et les autres sont vides dans la classe abstract "Comparable".
Je n'ai pas compris ce que tu voulais dire par "les autres sont vides", mais je tiens à rappeler que Comparable<T> n'est pas une classe, mais une interface !
Elle définit une méthode int compareTo(T o), que la classe Integer est également obligée d'implémenter pour respecter son contrat :

    public int compareTo(Integer anotherInteger) {
        return compare(this.value, anotherInteger.value);
    }

    public static int compare(int x, int y) {
        return (x < y) ? -1 : ((x == y) ? 0 : 1);
    }
0