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

avec Java Discussion :

Classe abstraite ou interface ou classe normale


Sujet :

avec Java

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut Classe abstraite ou interface ou classe normale
    Bonjour, bonsoir à tous,

    étant en pleine révision, je viens vous poser une question: Comment justifier l'implémentation d'une classe abstraite ou d'un interface ou d'une classe normale ?

    J'imagine qu'il y a plusieurs critères permettant de faire ces choix et ainsi de pouvoir justifier, mais j'aimerais en avoir le cœur net.

    Je sais que l'on ne peut hériter que d'une seule classe et que l'on peut implémenter plusieurs interfaces, donc on peut imaginer que parfois l'utilisation d'interfaces permettent de contourner le problème d'héritage multiple non proposé par Java ?


    Cela dit, c'est la seule différence que je vois entre classe abstraite et interface...les deux ne peuvent pas être instancié (sauf erreur de ma part).


    Afin de travailler sur ces questions là, je vous propose ce sujet

    Ce sujet a pour but de calculer le salaire de différents employés d'une entreprise en fonction de leur poste, de leurs horaires etc etc...Vous implanterez les propriétés suivantes introduites progressivement à chaque question par des interfaces, des classes abstraites ou des classes concrètes dont vous justifierez le choix. A chaque fois, sauf indication contraire, le code java complet est demandé.
    Pour moi, la difficulté principale de cet énoncé est de devoir justifier mes choix d'implémentation.
    1- Un salarié a un salaire (opération retournant un double). Définir en Java la notion de Salarié.

    2-Une prime est définie par un montant (opération retournant un double). Définir en Java la notion de Prime.

    3- Une prime de risque est une prime dont le montant est défini par une constante fixé (PRIME), d'une valeur de 100.0 euros. Définir en java la notion de PrimeDeRisque

    4- Une salarié primé est un salarié ayant une prime (fournie à la construction et pouvant être lue). Son salaire est calculé comme la somme d'un salaire de base et du montant de la prime. Le mode de calcul du salaire de base n'est pas connu ici et dépend du type de salarié primé. Définir en java la notion de SalariéPrimé

    5- Une prime de nuit est une prime accordée à un salarié primée. Elle est définit par un coefficient multiplicateur, encore appelée COEFPRIME et fixé à 1.5. Ce coefficient s'applique au salaire de base de l'employé pour donner le montant de la prime de nuit. Définir en java la notion de PrimeDeNuit.

    6- Les deux primes, primes de nuit et prime de risque peuvent être cumulées (leurs montant s'ajoutent). On introduit une prime de risque de nuit qui est à la fois une prime de risque et une prime de nuit.
    a- Cependant, il n'est pas possible de la définir par utilisation de l'héritage. Pourquoi ?
    b- On considère une prime de risque de nuit est une prime de nuit contenant une prime de risque. Définir en java la notion de PrimeDeRisqueDeNuit.
    c- On considère une prime de risque de nuit est une prime de risque contenant une prime de nuit. Définir en java la notion de PrimeDeRisqueDeNuit.

    Pour la suite, on suppose qu'un employé est un salarié ayant un nom. Une classe Employé, dont le code n'est pas demandé implante ce concept et permet de définir le nom par paramétrage du constructeur.


    7- Un technicien est un employé dont le salaire est proportionnel au nombre de pièce qu'il fabrique. Le coefficient est fixé (10 euros par pièces). et le nombre de pièces fourni par le constructeur. Définir en Java la notion de Technicien.

    8- Un vendeur est un employé dont le salaire de base est calculé en fonction de son chiffre d'affaire (fixe de 500 euros + 5% de son chiffre d'affaire). Un représentant est un employé dont le salaire de base est calculé de la même manière (fixe de 1000 euros +5% de son chiffre d'affaire).
    Sachant que le chiffre d'affaire de ces employés est fourni par le constructeur, définir deux classes en faisant en sorte de factoriser les informations communes. Des déclarations non explicitement demandées devront être ajoutées.

    9- L'ensemble du personnel est représenté par un tableau d'employé, le nombre maximal d'employé étant de 200. Définir la classe Personnel avec un constructeur, une opération permettant l'ajout d'un employé (un message d'erreur sera affiché en cas de débordement), une opération retournant le salaire moyen des employés et la méthode toString() retournant une chaine contenant le nom et le salaire de chaque employé.


    10- Un technicien à risque est à la fois un technicien et un salarié primé.

    a- Quel problème pose la transcription de cette propriété
    b- Introduire sous forme graphique les structures permettant d'exprimer cette propriété. Aucun code n'est demandé.
    c- Proposer une implémentation de TechnicienARisque exploitant une classe interne. On utilisera la notation C.this.m() dans une méthode de la classe interne pour appeler la méthode m() sur l'objet englobant.

    A partir de ce sujet, avant même de s'attaquer au vrai codage, je voudrais arriver à comprendre comment déterminer les choix d'implémentation: Interface, classe abstraite ou classe normale.



    Q1 et Q2 - En ce qui concerne Salarié et Prime, j'aurais réalisé des classes abstraites car on n'a pas besoin d'instancier un salarié seul ou une prime seule. Mais du coup, un interface serait aussi envisageable non ? Comment choisir ? Autre question, les notions de salaires et de montant de ces deux classes font elles références à une variable ou bien une méthode devant retourner un double ?

    Je vais pour l'instant stopper la ma réflexion, étant donné que la réponse de ceux deux premières questions vont pour ainsi dire conditionné tout le reste...par exemple s'il s'agit bien d'une méthode dans une classe abstraite, ces méthodes devront être définis dans l'héritage etc etc...
    J'ai l'impression que tout va découler du choix réalisé dans ces deux premières questions.


    Merci !

  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
    Une interface, faut voir ça comme un comportement, que des tas d'objets n'ayant rien à voir entre eux peuvent potentiellement avoir.
    Une classe abstraite c'est un objet, ça a une véritable existence (pas juste un comportement) mais il n'est pas complet. Par exemple un Animal peut être vu comme abstrait car son comportement "se déplacer" dépend du type d'animal (oiseau, etc.).

    Reprenons ta prime. Est-ce un comportement? Est-il logique qu'un travailleur soit une prime? Qu'une chaise soit une prime? ... Non, a priori un Prime, c'est une valeur encapsulée dans un objet, pas besoin d'en faire une interface. Je ne vois pas pourquoi on ne pourrait pas d'ailleurs instancier un travailleur sans prime Ou une prime sans travailleur. Après tout on pourrait associer la prime à un poste qui est à pourvoir.

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    Donc, mes primes et salariés sont bien des classes abstraites ?

    Ce qui nous amène ici

    6- Les deux primes, primes de nuit et prime de risque peuvent être cumulées (leurs montant s'ajoutent). On introduit une prime de risque de nuit qui est à la fois une prime de risque et une prime de nuit.
    a- Cependant, il n'est pas possible de la définir par utilisation de l'héritage. Pourquoi ?
    Impossible car cela impliquerait un héritage multiple.

    Et au niveau de la question 10 c'est le même problème si je ne m'abuse ?

  4. #4
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    en général une classe abstraite est la définition d'une mutualisation de code.
    donc tu peux avoir une prime abstraite et deux sous-classes qui ne peuvent pas hériter l'une de l'autre.
    exemple classique:
    client (ou autre) : classe abstraite
    personne physique: sous-classe
    personne morale: sous-classe
    mais personne physique et personne morale ne peuvent hériter l'une de l'autre (enfin dans l'univers de la programmation)

    bon ici le problème de la prime de risque de nuit est différent ..... une interface?

    un pattern classique est d'hériter d'une classe et de référencer un autre qui implante une interface commune:
    exemple: dans une banque le ClientSalarié hérite de Client et implante l'interface EstSalarié
    le Salarié implante l'interface EstSalarié
    le ClientSalarié opére par délégation sur un Salarié. (Il hérite des méthodes de Client et les méthodes définies par le contrat EstSalarié sont réalisées par délégation
    sur une référence vers un Salarié)
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    Pourriez vous me dire si ce que j'ai fais semble correct vis à vis de l'énoncé pour ces 4 premières questions:


    Q1-

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public interface Salarie {
    	public abstract double salaire();
     
    }
    Q2-


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface Prime {
    	public double montant();
    }
    Q3-

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class PrimeDeRisque implements Prime{
    	private final double PRIME=100.0;
     
    	public double montant(){
    		return PRIME;
    	}
     
    }
    Q4-

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public abstract class SalariePrime implements Salarie{
    	private Prime maPrime;
     
    	public SalariePrime(Prime p){
    		maPrime=p;
    	}
     
    	public double getSalaire(){
    		return maPrime.montant()+this.salaire();
    	}
     
    }
    S'il y a des erreurs je voudrais bien comprendre d'où elles viennent.

    Merci pour votre patience

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Classe abstraite et interface
    Par ender91 dans le forum Langage
    Réponses: 6
    Dernier message: 15/06/2007, 11h46
  2. Réponses: 5
    Dernier message: 28/03/2007, 17h28
  3. [POO] Différence entre Interface et classe Abstraite
    Par viviboss dans le forum Langage
    Réponses: 7
    Dernier message: 29/11/2006, 16h39
  4. Interface ou classe abstraite ?
    Par Premium dans le forum Langage
    Réponses: 8
    Dernier message: 21/02/2006, 10h23
  5. [Debutant][Conception] Classes abstraites et interface.
    Par SirDarken dans le forum Langage
    Réponses: 4
    Dernier message: 29/10/2004, 00h02

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