Rechercher : dans
Par :

Classe abstraite et interface de java

Dernière réponse le 1 sep 2009 à 21:08:47 wiam_, le 24 déc 2008 à 23:12:43 
 Signaler ce message aux modérateurs

Bonsoir tt le monde ,

j'ai un peu du mal à comprendre les inerfaces et les classes abstraite en java j'ai lu pas mal du tutoriel et j'ai compris au niveau des methode (dans le classe fille on doit inpmlementer tout les methode de l'interface ........), mon probleme est je comprend pas à quoi ça sert l'interface et la classe abstraite ? si on devrait definir leur methodes dans les classes filles ? et quand on devrait choisir un interface ou une classe abstraite ?
je serais tres reconnaissante si vous pourrez me repondre .MERCI

Configuration: Windows Vista
Firefox 3.0.5

Meilleures réponses pour « classe abstraite et interface de java » dans :
Classe abstraite et fonction virtuelle pure Voir Classe abstraite et fonction virtuelle pure Dans l’exemple de code 7.3(fonctions virtuelles), la classe Noeud a ceci de particulier qu’elle représente uniquement un concept. Elle a été définie pour isoler les caractéristiques générales des...
Le mot-clé static ou les attributs et méthodes de classe en POO Voir(NOTE: Cet article explique la signification du mot-clé static au sein d'une classe. La signification de "static" en C n'a par exemple rien à voir.) Vous êtes débutant en programmation orientée objet. En Java, en C++...ou que sais-je encore,...
Hibernate [Partie 1]: Présentation VoirPrésentation de Hibernate La Session Hibernate : Distribution et principales classes et interfaces : Hibernate est une couche résidant dans la JVM permettant d’assurer le mapping des objets JAVA cachés dans la JVM aux modèle...
Java - Les packages VoirIntroduction aux packages La programmation Java consiste à créer des classes. Or, étant donné qu'un programme est généralement développé par une équipe de programmeurs, c'est-à-dire plusieurs personnes, le fait de concaténer (mettre bout à bout)...
Les classes Java VoirLa notion d'objet Le langage Java intègre fortement le concept objet, il s'agit donc d'un langage orienté objet (LOO). Le terme langage orienté objet est plus qu'une simple appellation de plus pour désigner un type de langage, il...
Java: les variables VoirLe concept de variable Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage Java sont typées, c'est-à-dire que les données contenues dans...

1

walkhess, le 25 déc 2008 à 17:13:52

Voilà ce n'est pas aussi compliquer :

une classe abstraite est une classe dont les méthode sont abstrait c.à.d lorsque tu déclare une méthode abstract automatiquement tu doit définir la classe " abstract" et elle est utiliser généralement quand d'autre classes vont hériter de cette classe et ils ont la même méthode que la classe mére donc ont l'écrit pour ne pas répeter les mêmes méthodes chaque fois dans ces classes.

pour les interfaces sont utilisés quand d'autres classes qui vont avoir les même méthodes ont les définies dans une interfaces et puis l'implémenter ultérieurement même si tu n'a pas besoin d'une méthode dans l'interface tu doit l'implémenter par exemple tu peut simplement écrire le nom de la méthode puis ouvrir et fermer l'accolade(je crois que s'écrit comme ça non accolade) comme ça : public void méthode(){}. Engénéral il n'y a pas une grande différence entre interface et classe abstraire ; une interface est un cas paticulier d'une classe abstarite .

bonne travail

Répondre à walkhess

2

Marco la baraque, le 25 déc 2008 à 22:48:00

Bonsoir,
Pour compléter ce que dit Walkhess, l'utilisation d'interfaces et de classes abstraites, ça a deux avantages.
- la factorisation de code. Selon certains, la factorisation est l'un des avantages de la programmation orientée objet, selon d'autres (et j'adhère à ce mouvement de pensée), la factorisation ça ne sert à rien, sauf parfois à concevoir de mauvais programme par souci de "sur-factorisation".
La factorisation, ça consiste à écrire des méthodes dans les classes, de manière à pouvoir les réutiliser sans les retaper dans les classes filles. C'est ce qui est utilisé lorsque tu implémentes des méthodes dans ta classe abstraite : si toutes les classes filles ont le même comportement pour cette méthode, alors elle doit être implémentée une et une seule fois dans la classe abstraite
- l'abstraction (le polymorphisme). C'est la manière d'utiliser une référence vers une interface (qui définit une série de méthodes), et d'utiliser une implémentation concrète, mais sans la connaître.
Par exemple, quand tu vas utiliser une liste (interface java.util.List), tu ne vas pas connaître quelle implémentation tu vas utiliser. Tu vas par contre savoir que tu peux insérer un élément à un endroit, en supprimer un, connaître la taille...
Et donc dans ton code, tu vas utiliser une référence vers une List.
Ensuite, tu vas utiliser réellement une implémentation de cette interface, mais d'un point de vue utilisation, tu ne sauras pas ce que c'est. Que ce soit une LinkedList (suppression et insertion en O(n) par exemple), ou une ArrayList(en temps constant pour ces méthodes), ça ne t'intéresse que lorsque tu compares les performances lors de l'implémentation initiale de ton ensemble. Une fois que c'est fait, tu fais abstraction de cet aspect "bas-niveau" pour te concentrer uniquement sur l'utilisation de ta liste, et donc tu passes par ton interface.

En espérant avoir été un peu plus loin, sans avoir été trop confus...

Cordialement rtfm and jfgi

Répondre à Marco la baraque

3

wiam_, le 27 déc 2008 à 12:24:26

Merci à vous les deux c'est plus clair maintenant

Répondre à wiam_

4

misterETS, le 1 sep 2009 à 19:38:40

Bonjour messieur,
je sais que pour certain la "factorisation" semble inutile, mais ici, je vais vous expliquer ce à quoi ça sert. Il y a avant tout une grande nuance entre l'interface et la classe abstraite. L'interface permet de s'assurer que certaine classes filles auront sans aucun doute les méthodes définit dans celle-ci. La classes abstraite elle est un hybride entre une classe conventionnel et un interface. Elle offre une implémentation générique aux classes filles et également leur demande d'implémenter certaines choses pour lesquels la classe abstraite ne peut pas décider. Voici un exemple : Je veux réinventer Java2D et dessiner des formes a ma manière de A à Z. J'aurais donc une classe abstraite AbstraiteForme qui défini les méthodes de base telle que "setShader()", "setPosition()", etc. Par contre, la méthode dessiner() ne pourra pas être fournit par la classe abstraite. Donc cercle et carré auront a redéfinir comment elle voudront se déssiner. Les classes abstraite évite de réécrire 100 fois le meme bout de code dans chaque forme. Aussi, tu pourrais avoir une classe qui s'occupe de faire le draw. Avec une interface (ou une classe abstraite) ta pas besoin de savoir si tu va faire "dessiner()" sur un cercle ou un carré, tu sais juste que c'est une AbstraiteForme ou FormeIF et que ca ce dessine... Tu peux donc facilement ajouter ou retirer des forme dans ton système! :D Alors... la "factorisation"... c'est hyper puissant et ca sauve bcp de sous en dev (surtout coté maintenance!)
J'espere que c'est assez clair ;)

Répondre à misterETS

5

 Marco la baraque, le 1 sep 2009 à 21:08:47

Bonsoir,
Merci de ton avis.
J'avoue avoir été un peu extrême en affirmant que "la factorisation ne sert à rien". J'entendais simplement :
"il ne faut pas créer de classe abstraite uniquement par souci de factorisation".

En effet, dans ce cas, on augmente le risque de bugs en voulant rendre générique du code similaire (certes si tu as 50 fois la même méthode, c'est qu'il y a un problème dans ta conception), et on crée des classes abstraites qui n'ont absolument aucun intérêt ni technique ni fonctionnel, car elles servent juste à centraliser du code.

Pour moi la notion d'héritage est bien plus riche que ça : on doit avant tout hériter d'un type, puis ensuite on hérite (et éventuellement défini ou redéfini) de ses méthodes. C'est d'ailleurs ce que tu expliques dans ton exemple avec les formes : tes objets étendent ta classe abstraite car ils sont similaire d'un point de vue comportement (un carré ou un rectangle c'est une figure 2D, donc elles étendent ta classe Figure2D), et non pas uniquement pour factoriser le code.

Si tu veux uniquement factoriser du code, tu peux utiliser un design pattern Wrapper, ce sera d'autant plus propre que tu ne "perdra" pas ton héritage (dans de nombreux langages objets l'héritage multiple n'existe pas, et étendre une classe abstraite uniquement pour factoriser du code fera que ta classe ne pourra plus étendre de classe par la suite, ce qui peut être gênant si tu souhaites étendre un type et un comportement par la suite).

Cordialement, rtfm and jfgi
Simple "merci" makes helping people happy :)

Répondre à Marco la baraque