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 PHP Discussion :

héritage, classe abstraite - pb d'appelle de méthode [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 213
    Points : 111
    Points
    111
    Par défaut héritage, classe abstraite - pb d'appelle de méthode
    Bonjour,

    j'ai un petit soucis ou plutôt une incompréhension. Voici mes classes:
    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
     
    abstract class AMatch
    {
    	protected $maskInitial;
     
    	public function Init($a_init1, $a_init2)
    	{
    		//DEBUG
    		echo "Class: ".get_class($this)." Mask:".$this->maskInitial;
     
    		$this->_numeroTourEnCours++;
     
    		//Traitement des initiales
    		$this->TraiteInit($a_init1);
    	}
     
    	private function TraiteInit($a_init, $a_indiceEquipe=0)
    	{
    		echo "Méthode:  TraitInit - AMatch";
    	}
    }
     
    class Match extends AMatch
    {
    	public function __construct() {$this->maskInitial = "1-3";} 
    }
     
    class Simulateur extends Match
    {
    	public function __construct() {$this->maskInitial = "0-7";} 
     
    	private function TraiteInit($a_init, $a_indiceEquipe=0)
    	{
    		echo "Méthode: TraitInit - Simulateur";
    	}
    }
    Mon problème est que je ne comprends pas le comportement de ce fragment de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $toto = new Simulateur ();
    $toto->Init($array1, $array2);
    J'obtiens la sortie suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Class: Simulateur Mask: 0-7 Méthode: TraitInit - AMatch
    Je ne comprends pas pourquoi on passe par la méthode TraitInit de Amatch plutôt que celle redéfinie dans Simulateur. D'autant plus qu'il voit bien this comme du type Simulateur et qu'il me sort bien la valeur de l'attribut Mask correspondant au Simulateur.

    Si je duplique la méthode Init dans Simulateur, le problème est résolu. Mais là c'est qu'un extrait de code. Dans le code réel j'ai ce cas à plusieurs reprise et il est difficilement concevable de dupliquer beaucoup de méthodes. Ça pose des problème de maintenance.

    Quelqu'un a t'il une solution sans duplication de code pour le forcer à utiliser la "bonne" méthode ? D'avance merci.

  2. #2
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 5
    Points : 12
    Points
    12
    Par défaut
    Le problème est, que la méthode TraiteInit est "private" dans la classe "AMatch". Les méthodes privées ne peuvent pas être surchargées. Ces méthodes sont seulement visible dans ces classes où elles sont déclarées.

    Si tu changes la visibilité des classes "AMatch" et "Simulateur" à "protected" ou "public" ton programme devrait marcher.

  3. #3
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 213
    Points : 111
    Points
    111
    Par défaut
    Merci. Effectivement tu m'as devancé. Je viens d'essayé en mettant en public ma méthode et ça fonctionne. Je la passe donc en protected.

    Merci pour l'explication au moins comme ça c'est clair.

    C'est résolu .

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

Discussions similaires

  1. tableau héritage classe abstraite
    Par zeracoa dans le forum C++
    Réponses: 18
    Dernier message: 07/04/2013, 23h55
  2. héritage classes abstraites
    Par seroa dans le forum Langage
    Réponses: 4
    Dernier message: 12/10/2009, 14h31
  3. héritage, classe abstraite
    Par sebatlante dans le forum C++
    Réponses: 4
    Dernier message: 14/08/2009, 13h13
  4. héritage - classes abstraites
    Par Invité dans le forum C++
    Réponses: 2
    Dernier message: 03/05/2009, 12h17
  5. Réponses: 4
    Dernier message: 03/07/2006, 22h52

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