CONNEXION
  • RetourJeux
    • Tests
    • Soluces
    • Previews
    • Sorties
    • Hit Parade
    • Les + attendus
    • Tous les Jeux
  • RetourActu
    • Culture Geek
    • Astuces
    • Réalité Virtuelle
    • Rétrogaming
    • Toutes les actus
  • RetourHigh-Tech
    • Actus JVTECH
    • Bons plans
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTECH
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch
    • Xbox Series
    • Overwatch 2
    • FUT 23
    • League of Legends
    • Genshin Impact
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • PS4
  • One
  • Switch
  • Wii U
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Etoile Abonnement RSS

Sujet : L'héritage avec Java

DébutPage précedente
1
Page suivantePage suivante
GrandeGuerre GrandeGuerre
MP
Niveau 11
13 janvier 2017 à 18:30:21

Hello !

J'ai eu récemment un exercice comme ceci (je schématise, je suis via mobile) :


public class A { // code }
public class B extends A { // code }

B truc = new A ();

La question était : est-ce compilable ?

Alors malheureusement je crois m'être trompé, ayant répondu que non.
Mais est-ce que, concrètement, ça arrive en vrai c'est genre de cas ?
Si oui, vous auriez des exemples ? C'est une aberration dans mon esprit de faire ça. :(

DaMoY DaMoY
MP
Niveau 10
13 janvier 2017 à 18:34:47

Heu ce n'est clairement pas possible, le type statique ne peut pas être une sous classe du type dynamique [[sticker:p/1jnh]]

L'inverse cependant, A truc = new B(); est autorisé.

Message édité le 13 janvier 2017 à 18:35:20 par DaMoY
GrandeGuerre GrandeGuerre
MP
Niveau 11
13 janvier 2017 à 18:36:20

Ce genre de cas*

Parce que la déclaration elle me pique les yeux. Si on a un parent et un enfant, on crée soit l'un soit l'autre. Pas un espèce de bâtard comme ça, non ? :hap:

GrandeGuerre GrandeGuerre
MP
Niveau 11
13 janvier 2017 à 18:37:07

Oups oui j'ai interverti !

DaMoY DaMoY
MP
Niveau 10
13 janvier 2017 à 19:01:35

Le 13 janvier 2017 à 18:37:07 GrandeGuerre a écrit :
Oups oui j'ai interverti !

La réponse était bien oui alors :hap:

Comme exemple:


public class Personne { // code }
public class Adulte extends Personne { // code }

Personne truc = new Adulte ();

Un adulte est une personne mais une personne n'est pas forcément un adulte (première idée bidon qui m'est venue à l'esprit)

Message édité le 13 janvier 2017 à 19:03:31 par DaMoY
WatchItBurn WatchItBurn
MP
Niveau 10
13 janvier 2017 à 19:09:40

Le 13 janvier 2017 à 18:34:47 DaMoY a écrit :
Heu ce n'est clairement pas possible, le type statique ne peut pas être une sous classe du type dynamique [[sticker:p/1jnh]]

Quel rapport avec typage dynamique et statique ici ? :gne:

DaMoY DaMoY
MP
Niveau 10
13 janvier 2017 à 20:42:47

Le 13 janvier 2017 à 19:09:40 WatchItBurn a écrit :

Le 13 janvier 2017 à 18:34:47 DaMoY a écrit :
Heu ce n'est clairement pas possible, le type statique ne peut pas être une sous classe du type dynamique [[sticker:p/1jnh]]

Quel rapport avec typage dynamique et statique ici ? :gne:

Apparemment j'ai utilisé un vocabulaire que je ne connais pas, oubliez le typage :hap:

GrandeGuerre GrandeGuerre
MP
Niveau 11
14 janvier 2017 à 11:43:08

Un adulte est une personne mais une personne n'est pas forcément un adulte (première idée bidon qui m'est venue à l'esprit)

Ça c'est très clair. Mais la déclaration passe pas dans ma tête.
Soit t'as un Adulte, soit une Personne, tu vas pas instancier ton Adulte en tant que Personne, vu que c'est l'intérêt d'avoir un héritage, non ?

HowItWorks HowItWorks
MP
Niveau 10
14 janvier 2017 à 11:57:35

Le 14 janvier 2017 à 11:43:08 GrandeGuerre a écrit :

Un adulte est une personne mais une personne n'est pas forcément un adulte (première idée bidon qui m'est venue à l'esprit)

Ça c'est très clair. Mais la déclaration passe pas dans ma tête.
Soit t'as un Adulte, soit une Personne, tu vas pas instancier ton Adulte en tant que Personne, vu que c'est l'intérêt d'avoir un héritage, non ?

On instancie en tant qu'adulte, mais la variable déclarée est de type Personne [[sticker:p/1kkn]]
(instance = membre de droite de l'opération cad le type après le new, déclaration = membre de gauche).

L'utilité c'est d'avoir un couplage faible entre ton programme et l'implémentation choisie. En l'occurrence si la suite de ton bout de code fonctionne à minima sur une Personne, on déclarera la variable comme une Personne vu qu'on n'a pas besoin de connaître la spécialisation (Adulte).

Si demain je n'utilise plus l'implémentation Adulte ou la remplace par une autre, le programme reste inchangé.

Message édité le 14 janvier 2017 à 12:00:16 par HowItWorks
GrandeGuerre GrandeGuerre
MP
Niveau 11
14 janvier 2017 à 12:37:29

Ah donc c'est dans un souci de maintenabilité ?

HowItWorks HowItWorks
MP
Niveau 10
14 janvier 2017 à 12:44:10

Le 14 janvier 2017 à 12:37:29 GrandeGuerre a écrit :
Ah donc c'est dans un souci de maintenabilité ?

Essentiellement. En informatique il faut toujours privilégier des couplages faibles à des couplages forts.
En revanche si la spécialisation est nécessaire dans ton programme, on va déclarer la variable comme type enfant.

C'est un peu le même principe quand on déclare des map en Java.
Tu peux selon les cas utiliser des HashMap, des LinkedHashMap, des ConcurrentHashMap TreeMap etc.. mais dans tout ton programme tu utiliseras l'interface Map. Ca te permet de changer d'implémentation tout en gardant un programme fonctionnel.

Message édité le 14 janvier 2017 à 12:46:14 par HowItWorks
arsh222 arsh222
MP
Niveau 10
14 janvier 2017 à 13:49:44

l'intérêt c'est aussi d'avoir des fonctions du style manger(Nourriture plat) et de pouvoir les appeler avec des classes héritantes comme paramètres : manger(BoeufEnDaube) ; manger(SoupeALOignon)

GrandeGuerre GrandeGuerre
MP
Niveau 11
15 janvier 2017 à 13:10:12

D'accord, je comprends déjà mieux l'intérêt expliqué comme ça. Merci !

En gros, dans ma vision initiale de la chose, on avait ça :

public class Personne {
    // some code
}

public class Etudiant extends Personne {
   // some code
}

Et faire Etudiant eleve1 = new Personne() me semblait incohérent, dans le sens où Etudiant est explicitement une Personne, vu que Etudiant hérite de Personne.
Donc à mon sens, c'était illogique. Je veux dire, oui, un élève est une personne, mais un élève est aussi un étudiant. :(

Enfin du coup, les méthodes je trouve ça plus explicite, merci beaucoup !

DébutPage précedente
1
Page suivantePage suivante
Répondre
Prévisu
?
Victime de harcèlement en ligne : comment réagir ?
Infos 0 connecté(s)

Gestion du forum

Modérateurs : godrik, LGV
Contacter les modérateurs - Règles du forum

Sujets à ne pas manquer

La vidéo du moment