Page 1 sur 1

probléme avec ma structure POO

Posté : 05 mai 2013, 05:10
par piver2012
Bonjour a tous
je voudrais faire un système de calcul de paie pour les employés d'une entreprise.
L'entreprise comporte des téléphonistes qui sont payés à l'heure, des vendeurs qui sont payés à l'heure ET à commission,
et des superviseurs, qui ont un salaire annuel fixe. À chaque semaine, la structure créé sera remplie avec les informations suivantes pour chaque employé : les téléphonistes ont un salaire horaire, et des
heures, les vendeurs ont la même chose mais ont aussi un taux de commission et un total de ventes en dollars.
Les superviseurs n'ont pas ces informations.
j'ai donc créé une classe abstraite pour employé puis le premier type d'employé(téléphoniste hérite de cette classe),le deuxième type d’employé hérite du premier type employé tout fonctionnait mais quand je rajoute le dernier type superviseur la ça marche plus si quelqu’un peut m'aider ce serait apprécié voici mon code:
abstract class Employe
	{
		//ici il faudrait ajouter l'encapsulation
		public $nom;
		public $numeroassurance;
		public $nombreheure;
		public function __construct($nom, $numeroassurance,$nombreheure)
		{
			$this->setNom($nom);
			$this->setNumeroAssurance($numeroassurance);
			$this->setNombreheure($nombreheure);

		}
		function setNom($nom)
		{
			$this->nom = $nom;
		}
		
		function getNom()
		{
			return $this->nom;
		}
		
		function setNumeroAssurance($numeroassurance)
		{
			$this->numeroassurance = $numeroassurance;
		}
		
		function getnumeroassurance()
		{
			return $this->numeroassurance;
		}
		function setNombreheure($nombreheure)
		{
			$this->nombreheure = $nombreheure;
		}
		
		function getNombreheure()
		{
			return $this->nombreheure;
		}




		//cette méthode abstraite force l'implémentation d'afficheResume dans les classes qui héritent de Produit
		abstract function CalculSalaire();
	}

	class EmployeSalaireHoraire extends Employe
	{		
		public $tauxhoraire;
		
		public function __construct($nom, $numeroassurance, $nombreheure,$tauxhoraire)
		{
			parent::__construct($nom,$numeroassurance,$nombreheure);
			//$this->nombreDePistes = $nombreDePistes;
			
		$this->tauxhoraire = $tauxhoraire;
		}
		
		public function CalculSalaire()
		{
			$salaire=$this->tauxhoraire*$this->nombreheure;
			return $salaire;
			
		}
	

		function affiche(){

				return "Je suis un employe qui a un salaire de " . $this->CalculSalaire() ;
		}
	}
	
	class EmployeCommission extends EmployeSalaireHoraire
	{
		public $commission;
		
		public function __construct($nom, $numeroassurance, $nombreheure,$tauxhoraire, $commission)
		{
			parent::__construct($nom,$numeroassurance,$nombreheure,$tauxhoraire);			
			$this->commission = $commission;
			//$this->nombreDePages = $nombreDePages;
		}
		
		public function CalculSalaire()
		{
			$salaire=$this->tauxhoraire*$this->nombreheure+$this->commission;
			return $salaire;
		}
	
		function affiche(){

				return "Je suis un employe qui a salaire de " . $this->CalculSalaire() ;
		}

	}
	class EmployeSuperviseur extends EmployeSalaireHoraire
	{
		public $salaireAnnuelle;
		public function __construct($nom,$numeroassurance,$salaireAnnuelle)
		{
		parent::__construct($nom,$numeroassurance);
		$this->salaireAnnuelle=$salaireAnnuelle;
		}
		
	}
	class Paie
	{
		
		private $tabPaie = array();
		
		
		public function ajoutePaie(Employe $employe)
		{
			$this->tabPaie[] = $employe;		
		}	
		
		public function affiche()
		{
			echo "<ul>";
			foreach($this->tabPaie as $employe)
			{
				echo "<h2>"."<li> Nom de l'employe: "."</h2>" . $employe->nom . "</li>";
				echo "<h2>"."<li>Numero d'assurance social: " ."</h2>". $employe->numeroassurance . "</li>";
				echo "<h2>"."<li>Nombre d'heures travailles: " ."</h2>". $employe->nombreheure . "</li>";
				echo "<h2>"."<li>Taux horaire: " ."</h2>". $employe->tauxhoraire . "</li>";
				echo "<h2>"."<li>Salaire: " ."</h2>". $employe->CalculSalaire() . "</li>";
				

			}
			echo "</ul>";
		}
	}
	
	$telephoniste = new EmployeSalaireHoraire("mona lisa", 265369874, 25, 15);
	$vendeur = new EmployeCommission("jean claude bernard", 256369987, 35, 19, 100);
	$superviseur =new EmployeSuperviseur("michel drolet",296333152,60000);
	$InfosEmploye = new Paie();
	$InfosEmploye->ajoutePaie($telephoniste);
	$InfosEmploye->ajoutePaie($vendeur);
	$InfosEmploye->ajoutePaie($superviseur);
	$InfosEmploye->affiche();
	//echo "salaire : " . $telephoniste->CalculSalaire() . "<br/>";
	//echo "salaire : " . $vendeur->CalculSalaire() . "<br/>";



Re: probléme avec ma structure POO

Posté : 07 mai 2013, 21:21
par sadeq
Bonjour,

Ce n'est pas logique de centraliser l'affichage de données hétérogènes provenant des classes filles à partir d'un domaine générique traitant la classe mère.
En effet, ton tableau $tabPaie contient différents objets issus de classes filles, donc la méthode afficher de la classe Paie ne peut pas faire des accès aux membres des objets d'une façon anonyme et générique car tout simplement chaque objet classe fille est spécialisé et se différencie par rapport aux autres.

La solution logique est d'implémenter une méthode commune entre les classes filles (comme la méthode "calculerSalaire") qui permet d'afficher les propriétés de chaque objet par lui même, puis appeler cette méthode dans la classe Paie.

Voici une solution (Attention : j'ai renommé et réécrit certaines choses)
<?php
abstract class Employes
        {
                //ici il faudrait peut-être revoir le niveau d'encapsulation public, protected ou private)
                protected $nom;
                protected $numeroassurance;

                public function __construct($nom, $numeroassurance)
                {
                        $this->setNom($nom);
                        $this->setNumeroAssurance($numeroassurance);

                }
                function setNom($nom)
                {
                        $this->nom = $nom;
                }
                
                function getNom()
                {
                        return $this->nom;
                }
                
                function setNumeroAssurance($numeroassurance)
                {
                        $this->numeroassurance = $numeroassurance;
                }
                
                function getnumeroassurance()
                {
                        return $this->numeroassurance;
                }

                //méthodes abstraites pour imposer leur implémentation dans les classes filles
                abstract function calculerSalaire();
		abstract function afficher();
        }

        class EmployeSalaireHoraire extends Employe
        {               
                protected $tauxhoraire;
                protected $nombreheure;
				
                public function __construct($nom, $numeroassurance, $nombreheure,$tauxhoraire)
                {
                        parent::__construct($nom,$numeroassurance);
                        $this->setNombreheure($nombreheure);
			$this->setTauxhoraire($tauxhoraire);
                }
                function setNombreheure($nombreheure)
                {
                        $this->nombreheure = $nombreheure;
                }
                function getNombreheure()
                {
                        return $this->nombreheure;
                }
                function setTauxhoraire($tauxhoraire)
                {
                        $this->tauxhoraire = $tauxhoraire;
                }
                function getTauxhoraire()
                {
                        return $this->tauxhoraire;
                }
				
                public function calculerSalaire()
                {
                        return $this->getTauxhoraire() * $this->getNombreheure();
                }
        
                function afficher(){
                    echo "<ul>
			<li> Nom de l’employé : " . $this->getNom() . "</li>
			<li>Numéro d'assurance sociale : " . $this->getNumeroassurance() . "</li>
			<li>Nombre d'heures travaillées : " . $this->getNombreheure() . "</li>
			<li>Taux horaire : " . $this->getTauxhoraire() . "</li>
			<li>Salaire : ". $this->calculerSalaire() . "</li>
			</ul>";	
                }
        }
        
        class EmployeCommission extends EmployeSalaireHoraire
        {
                protected $commission;
                
                public function __construct($nom, $numeroassurance, $nombreheure,$tauxhoraire, $commission)
                {
                        parent::__construct($nom,$numeroassurance,$nombreheure,$tauxhoraire);                   
                        $this->commission = $commission;
                        //$this->nombreDePages = $nombreDePages;
                }
                function setCommission($commission)
                {
                        $this->commission = $commission;
                }
                function getCommission()
                {
                        return $this->commission;
                }
                public function calculerSalaire()
                {
                        return parent::__calculerSalaire() + $this->getCommission();
                }
        
                function afficher(){
                    echo "<ul>
			<li> Nom de l’employé : " . $this->getNom() . "</li>
			<li>Numéro d'assurance sociale : " . $this->getNumeroassurance() . "</li>
			<li>Nombre d'heures travaillées : " . $this->getNombreheure() . "</li>
			<li>Taux horaire : " . $this->getTauxhoraire() . "</li>
			<li>Commission : " . $this->getCommission() . "</li>
			<li>Salaire : ". $this->calculerSalaire() . "</li>
			</ul>";	
                }

        }
        class EmployeSuperviseur extends Employe
        {
                protected $salaireAnnuel;

                public function __construct($nom,$numeroassurance,$salaireAnnuel)
                {
			parent::__construct($nom,$numeroassurance);
			$this->salaireAnnuel=$salaireAnnuel;
                }
		function setSalaireAnnuel($salaireAnnuel)
                {
                        $this->salaireAnnuel = $salaireAnnuel;
                }
                function getSalaireAnnuel()
                {
                        return $this->salaireAnnuel;
                }
                public function calculerSalaire()
                {
                        return $this->getSalaireAnnuel();
                }
        
                function afficher(){
                    echo "<ul>
			<li>Nom de l’employé : " . $this->getNom() . "</li>
			<li>Numéro d'assurance sociale : " . $this->getNumeroassurance() . "</li>
			<li>Salaire : ". $this->calculerSalaire() . "</li>
			</ul>";	
                }
        }
        class Paie
        {
                private $tablePaie = array();

                public function ajouterPaie(Employe $employe)
                {
                        $this->tablePaie[] = $employe;            
                }
                public function afficher()
                {
			echo "<h1>Liste des employés</h1>";
			foreach($this->tablePaie as $employe)
			{
				$employe->afficher();
			}
                }
        }
        
       //TEST DU MODÈLE
        $secretaire= new EmployeSalaireHoraire("Mona Lisa", 265369874, 25, 15);
        $vendeur = new EmployeCommission("Jean-claude Bernard", 256369987, 35, 19, 100);
        $comptable=new EmployeSuperviseur("Michel Duolet",296333152,60000);
        $InfosEmploye = new Paie();
        $InfosEmploye->ajouterPaie($secretaire);
        $InfosEmploye->ajouterPaie($vendeur);
        $InfosEmploye->ajouterPaie($comptable);
        $InfosEmploye->afficher();
?>

Re: probléme avec ma structure POO

Posté : 19 sept. 2013, 16:29
par drooss
Bonjour,
le problème vient surtout d'un erreur sur l'heritage de EmployeSuperviseur qui hérite de EmployeSalaireHoraire alors qu'il devrait hériter d Employe


EDIT: oups désolé je viens de voir la date du sujet ...