IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

L’utilité des interfaces dans l’orienté objet


Sujet :

Langage Java

  1. #1
    Inactif
    Inscrit en
    Juin 2008
    Messages
    304
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 304
    Points : 96
    Points
    96
    Par défaut L’utilité des interfaces dans l’orienté objet
    Bonjour

    Pour illustré plus ou je veux en venir j’ai fait un petite exemple :

    D’après moi dans le maïeur des cas elle devra donnés la possibilité
    De ne pas récrire le même code de la même méthode dans toutes les classes

    Donc si j’utilise une interface dans la classe Etudiant_salarier en devra pouvoir redéfinir tout c’est méthode de plus de réutilise le Code de la méthode dans la classe Etudiant et Salarier et de Personne dans 1 seul méthode de la classe Etudiant_salarier et tous sa sans le réécrire (le code).

    Ce qui serais bien c’est que je puise accède de Etudiant_Salarier à la classe Etudiant (de la méthode EnCoure(); )et je pourrai accèdes à la classe Personne grâce a l’héritage !.

    En claire je me demandés si le faite d’implémenter une interface dans plusieurs classe Réagit comme un Héritage (peu être multiple).

    Voila des liens qui peu vous aidez à comprendre ce que je veux dire par la :

    http://www.developpez.net/forums/d68...ceptuels-code/

    Ou :

    http://www.developpez.net/forums/d68...entation-code/

    Mais je ne suis pas arrivé si quelqu’un peu donnée des ides.

    voici le code ou je fait met Test:
    sur les classe Perssone, Etudiant, Salarier, et Etudiant_Salarier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    package com.dz.IHM;
     
    public interface IPersonne {
     
    	public void Manger();
    	public void Courir();
    	public void Dormir();
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    package com.dz.IHM;
     
    public interface IEtudiant {
     
    	public void Reviser();
    	public void EnCoure();
    	public void Reflechir(); 
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    package com.dz.IHM;
     
     
    public interface ISalarie {
     
    	public void EnTravaille();
    	public void Payement();
    	public void RealiseProjet(); 	
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    import com.dz.IHM.IPersonne;
     
     
    public abstract class Personne implements IPersonne {
    	//abstract POUR Quoi  ?
     
    	public Personne(){
    		System.out.println("Le Constructeur de Personne");
    	}
     
    	public void Courir() {
     
    		System.out.println("je suis la Méthode Courir de Personne");
     
    	}
     
    	public void Dormir() {
    		System.out.println("je suis la Méthode Dormir");
     
    	}
     
    	public void Manger() {
    		System.out.println("je suis la Méthode Manger");
     
    	}
     
    	/* Sacha que Concéptuelement un EtudiantSalarie == Personne */
        /* ***********Méthode(Comportement)par défaut des Etudiant********* */
    	public void EnCoure() {
    		System.out.println("je suis la Méthode EnCoure de Personne");
     
    	}
     
    	public void Reflechir() {
    		System.out.println("je suis la Méthode Reflechir de Personne");
     
    	}
     
    	public void Reviser() {
    		System.out.println("je suis la Méthode Reviser de Personne");
     
    	}
    	/* **************************************************************** */
     
    	/* ***********Méthode(Comportement)par défaut des Salarie********* */
    	public void EnTravaille() {
    		System.out.println("je suis la Méthode EnTravaille de Personne");
     
    	}
     
    	public void Payement() {
    		System.out.println("je suis la Méthode Payement de Personne");
     
    	}
     
    	public void RealiseProjet() {
    		System.out.println("je suis la Méthode RealiseProjet de Personne");
     
    	}
    	/* **************************************************************** */
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    import com.dz.IHM.IEtudiant;
     
     
    public class Etudiant extends Personne implements IEtudiant {
     
     
         public void Courir() {
     
    		System.out.println("je suis la Méthode Courir de Etudiant");
     
    	}
     
     
     
    	public void EnCoure() {
    		super.EnCoure();
    		System.out.println("je suis la Méthode EnCoure de la classe Etudiant");
     
    	}
     
    	public void Reflechir() {
    		System.out.println("je suis la Méthode Reflechir");
     
    	}
     
    	public void Reviser() {
    		System.out.println("je suis la Méthode Reviser");
     
    	}
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    import com.dz.IHM.ISalarie;
     
     
    public class Salarie extends Personne implements ISalarie {
     
     
    	public void EnCoure() {
    	super.EnCoure();
    	System.out.println("je suis la Méthode EnCoure de la classe Etudiant");	
    		}
     
    	public void EnTravaille() {
    		System.out.println("je suis la Méthode EnTravaille");
     
    	}
     
    	public void Payement() {
    		System.out.println("je suis la Méthode Payement");
     
    	}
     
    	public void RealiseProjet() {
    		System.out.println("je suis la Méthode RealiseProjet");
     
    	}
     
    }
    La classe « EtudiantSalarie» :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
     
    import com.dz.IHM.IEtudiant;
    import com.dz.IHM.IPersonne;
    import com.dz.IHM.ISalarie;
     
     
    public class EtudiantSalarie extends Personne implements IPersonne, IEtudiant, ISalarie {
     
    	public EtudiantSalarie(){
    		super();
    		System.out.println("Le Constructeur de EtudiantSalarie");
    	}
     
    	public void Courir() {
    		super.Courir();
    		System.out.println("je suis la Méthode Courir de EtudiantSalarie");
     
    	}
     
    	public void Dormir() {
    		System.out.println("je suis la Méthode Dormir");
     
    	}
     
    	public void Manger() {
    		System.out.println("je suis la Méthode Manger");
     
    	}
     
    	public void EnCoure() {
    		super.EnCoure();
    		System.out.println("je suis la Méthode EnCoure de EtudiantSalarie");
     
    	}
     
    	public void Reflechir() {
    		System.out.println("je suis la Méthode Reflechir");
     
    	}
     
    	public void Reviser() {
    		System.out.println("je suis la Méthode Reviser");
     
    	}
     
    	public void EnTravaille() {
    		System.out.println("je suis la Méthode EnTravaille");
     
    	}
     
    	public void Payement() {
    		System.out.println("je suis la Méthode Payement");
     
    	}
     
    	public void RealiseProjet() {
    		System.out.println("je suis la Méthode RealiseProjet");
     
    	}
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    import com.dz.IHM.IEtudiant;
     
     
     
    public class Test {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		System.out.println("je suis la Méthode Main");
    		IEtudiant p = new EtudiantSalarie();
    		//p.Courir();
    		  p.EnCoure();
          /* Grace aux l'interface je peu utiliser touts
    		  les métode des classe qui l'implémante cette interface */
    	}
     
    }
    pour résumé:

    Si c'est possible d'aller direct à et en même Temps à
    Etudiants et salarie puis par héritage a personne
    Pour ne pas ce retapés le code des méthode de Etudiant et Salarie dans la Classe EtudiantSalarie


    Si c’est possible des données une idées ou solution en Java.

    Merci d’avance.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Si ton problème est que EtudiantSalarié doit récupérer des méthodes de IEtudiant et de ISalarié et que, en même temps, tu veux récupérer le code de la classe Etudiant et la Classe de Salarié, tu risque de devoir passer par un patron du style delegate. Généralement, dans ce genre de cas, on par de Etudiant ou de Salarié et on ajoute les méthodes qui manquent. Si tu veux vraiement récupérer les code de tes deux classes et que tu sais ce que tu fait, utilise le patron delegate:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class EtudiantSalarie extends Etudiant implements ISalarie{
     
       private ISalarie salarie;
       public EtudiantSalarie(.....){
           super(.....);
           salarie  = new Salarie(....);
       }
       public xxx uneMethodeDeSalarie(....){
           return salarie.uneMethodeDeSalarie(....);
       }
    }

    Note: en java on utilise pas la notaiton Ixxxx pour maquer des interfaces, tu ne trouvera presque jamais ces conventions utilisée, elle viennent plutot du monde c++ / .net. Les interfaces java sont manipulées comme les autres (elles n'ont juste pas de constructeur)


    Note: en pratique il est très rare d'avoir vraiment besoin de ce genre d'héritage. Dans ton exemple, les méthodes associées à l'interface Salarie auront clairement des comportement différent sir le salarié est un étudiant ou pas. Dans le cas de l'étudiant, il y aura vraisemblablement des règle sur les limites de salaires, des règles sur la taxation etc qui seront complètement différente -> peu d'intérêt de récupérer le code. Et c'est très souvent le cas quand quelqu'un demande de l'héritage multiple, il y a tellement de contraites derrière que réécrire les méthodes concernées est plus propre, plus rapide et plus souple

    Je fais du java depuis des années, je n'ai jamasui eu beosin d'héritage multiple au delà de ce que propose java avec ses interfaces Quand on veux récupérer du code d'un classe xtérieur implémentant déjà l'interface, soit on hérite (si c'est possible) soit on fait de la délégation (qui marche très bien)

  3. #3
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Bon, je pense que le plus simple pour comprendre (l'énorme) utilité des interfaces java est de les présenter comme une définition de "contrat".
    Il est certain qu'une interface implémentée par une (et une seule) classe n'a pas de gros intérêt (immédiat), par contre, imagine ce cas :

    - des Voitures
    - des Avions
    - des Bateaux

    Tous ces "objets" se déplacent, la façon de le faire leur est par contre très spécifique. On va donc définir une interface "Deplacement" qui aura (pour simplifier) 2 méthodes :
    - avancer(sens)
    - tourner(sens)

    Nos objets implémenteront cette interface, ce qui les obligera à implémenter les 2 méthodes, en fonction de leurs caractéristiques.

    Maintenant, on asservit ces objets à un programme de gestion des déplacements. Il aura donc une liste d'objets (Voitures, Avions, Bateaux) dans sa liste d'éléments à déplacer et il pourra les voir par leur "contrat" "Deplacement" et invoquer leurs méthodes (avancer, tourner) sans ce soucier du type physique de l'objet.
    D'un point de vu java 5, on pourra écrire List<Deplacement>, ce qui limitera déjà la possibilité d'ajouter des objets n'implémentant pas l'interface et donc, que le programme serait incapable de gérer...

    Finalement, avec l'interface, on ne voit l'objet que par un ensemble de "possibilités", mais pas toutes...

    C'est plus clair pour toi ?

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Inactif
    Inscrit en
    Juin 2008
    Messages
    304
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 304
    Points : 96
    Points
    96
    Par défaut
    Merci pour vos réponses.

    Voila je pense avoir vu et vaincu

    Donc j’ai testé ce que tu m'as dit « tchize_ » et ça marche très bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    public class EtudiantSalarie extends Personne implements IPersonne, IEtudiant, ISalarie {
     
        private ISalarie salarie;
        public  IEtudiant etudiant;
     
        public void EnCoure() {
     
        super.EnCoure();
        etudiant = new Etudiant();
        etudiant.EnCoure();
     
        System.out.println("je suis la Méthode EnCoure de EtudiantSalarie");
        }
    ..
    }
    Et donc si j’ai bien compris l’utilité de cet interface est de :

    1- Récupérer du code d’une classe qui implémente cet interface en Polymorphe le code de la méthode qu'on veut récupèrer.

    2- Un avantage d’encapsulation (regroupement) des méthodes qui ont besoin d’être réutilisées dans différentes classes. (ou et Mise à jour simplifiée en cas de modification du code puisque Conceptuellement chaque bout de code sera à sa place logique, ce qui fait qu'en cas d’erreur dans ces méthodes on va rapidement localiser cette erreur)

    3- D'un niveau conception c’est plus réaliste.
    4- Simplification du code (plus clair).
    5- et faire de la simulation de héritage multiple.

    Donc, si il y a d’autres avantages ou une mauvaise compréhension de ma part je vous remercie d’avance de me corriger s'il y a lieu, ou d’autres idées ou avantages que je n’ai pas vu.
    Merci

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Je dirais que l'intérêt de l'interface réside dans le fait qu'on voit un objet par le biais d'une fonctionnalité et non d'une instance d'un objet particulier ce qui, d'un point de vue polymorphe, est un gros avantage... et supprime le problème de cast...
    Un inconvénient en contre partie est que parfois, on a besoin du debogger pour connaître l'instance de l'objet qu'on manipule
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/10/2010, 14h22
  2. interet des interfaces dans une architecture n-tiers
    Par anouar204 dans le forum Architecture
    Réponses: 1
    Dernier message: 28/01/2010, 19h14
  3. Réponses: 24
    Dernier message: 18/12/2009, 14h25
  4. Utilisation des interfaces dans des méthodes
    Par kyrilkarlier dans le forum Windows Forms
    Réponses: 7
    Dernier message: 26/05/2009, 14h29
  5. Utilité des accolades dans PHP
    Par laxe13 dans le forum Langage
    Réponses: 5
    Dernier message: 27/09/2008, 23h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo