Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/03/2011, 11h51   #1
Invité de passage
 
Inscription : février 2007
Messages : 11
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 11
Points : 3
Points : 3
Par défaut [POO] Souci sur héritage

Salutations !

Je m'en viens vers vous car je ne trouve pas de solution à mon petit souci.
J'ai du mal comprendre un aspect de la notion d'héritage en objet et je me heurte à un petit mur que j'espère vous m'aiderez à franchir.

Voici le type de souci que j'ai :
Code :
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
 
class Animal
{
    public function Mouvement()
    {
        // script de mouvement
 
        // On rencontre un autre animal pendant le mouvement ? on lui dit bonjour
        echo $this->Bonjour($animal);
    }
    private function Bonjour($animal)
    {
        $texte = 'Bonjour '.get_class($animal);
        return $texte
    }
}
 
class Chat extends Animals
{
    private function Bonjour($animal)
    {
        $type = get_class($animal);
 
        switch($type)
        {
            case 'Chien':
                $texte = 'Le chat fuit, il a peur du chien';
                break;
            case default:
                $texte = 'Bonjour '.$type;
                break;
        }
        return $texte
    }
}
 
class Chien extends Animals
{
}
Quoi qu'il advienne si un chat rencontre un autre animal, c'est toujours la fonction Bonjour de la classe Animal qui est appelée et non pas celle qui la remplace dans Chat.

Où se situe mon erreur ?

Merci d'avance pour votre aide.

Edit :
Je viens de trouver une solution à mon souci à l'instant.
Mais est-ce la bonne méthode ?
Merci.

Code :
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
 
class Animal
{
    public function Mouvement()
    {
        // script de mouvement
 
        // On rencontre un autre animal pendant le mouvement ? on lui dit bonjour
        $class = get_class($animal);
        echo $class::Bonjour($animal);
    }
    public function Bonjour($animal)
    {
        $texte = 'Bonjour '.get_class($animal);
        return $texte
    }
}
 
class Chat extends Animals
{
    public function Bonjour($animal)
    {
        $type = get_class($animal);
 
        switch($type)
        {
            case 'Chien':
                $texte = 'Le chat fuit, il a peur du chien';
                break;
            case default:
                $texte = 'Bonjour '.$type;
                break;
        }
        return $texte
    }
}
 
class Chien extends Animals
{
}
maosalia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2011, 13h36   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
mais t'as testé ton code ???
parce que il est complétement faux.
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2011, 15h14   #3
Invité de passage
 
Inscription : février 2007
Messages : 11
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 11
Points : 3
Points : 3
Afin de simplifier la demande, voici un code complet qui fonctionne et qui illustre mieux ma question :

Code :
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
64
65
66
67
68
69
70
71
72
73
74
<?php
class Animal
{
	private $_nom; // le nom de l'animal
	private $_position; // sa position dans la rue
 
    public function Mouvement($pas, $animaux)
    {
        while ($pas > 0)
		{
			$this->_position ++;
 
			// un animal est-il présent dans la case d'arrivé ?
			foreach ($animaux as $animal)
			{
				$animal_position = $animal->Position();
 
				// si oui on lui dit bonjour
				if ($this->_position == $animal_position && $this != $animal)
				{
					echo $this->Bonjour($animal);
				}
			}
			$pas --;
		}
    }
 
	public function Position()
	{
		return $this->_position;
	}
 
    private function Bonjour($animal)
    {
        $texte = 'Bonjour '.get_class($animal);
        return $texte;
    }
 
	public function __construct($nom, $position)
	{
		$this->_nom = $nom;
		$this->_position = $position;
	}
}
 
class Chat extends Animal
{
    private function Bonjour($animal)
    {
        $type = get_class($animal);
 
        switch($type)
        {
            case 'Chien':
                $texte = 'Le chat fuit, il a peur du chien';
                break;
            default:
                $texte = 'Bonjour '.$type;
                break;
        }
        return $texte;
    }
}
 
class Chien extends Animal
{
}
 
$medor = new Chien('medor', 4);
$catzie = new Chat('catzie', 1);
 
$rue = array($medor, $catzie);
 
$catzie->Mouvement(5, $rue);
maosalia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2011, 23h37   #4
Invité de passage
 
Inscription : février 2007
Messages : 11
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 11
Points : 3
Points : 3
Code :
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
64
65
66
67
68
69
70
71
72
73
74
75
76
<?php
class Animal
{
	private $_nom; // le nom de l'animal
	private $_position; // sa position dans la rue
 
    public function Mouvement($pas, $animaux)
    {
        while ($pas > 0)
		{
			$this->_position ++;
 
			// un animal est-il présent dans la case d'arrivé ?
			foreach ($animaux as $animal)
			{
				$animal_position = $animal->Position();
 
				// si oui on lui dit bonjour
				if ($this->_position == $animal_position && $this != $animal)
				{
					echo $this->Bonjour($animal);
				}
			}
			$pas --;
		}
    }
 
    public function Position()
    {
	return $this->_position;
    }
 
    protected function Bonjour($animal)
    {
        $texte = 'Bonjour '.get_class($animal);
        return $texte;
    }
 
	public function __construct($nom, $position)
	{
		$this->_nom = $nom;
		$this->_position = $position;
	}
}
 
class Chat extends Animal
{
    protected function Bonjour($animal)
    {
        $type = get_class($animal);
 
        switch($type)
        {
            case 'Chien':
                $texte = 'Le chat fuit, il a peur du chien';
                break;
            default:
                $texte = 'Bonjour '.$type;
                break;
        }
        return $texte;
    }
}
 
class Chien extends Animal
{
}
 
$medor = new Chien('medor', 4);
$catzie = new Chat('catzie', 1);
 
$rue = array($medor, $catzie);
 
$catzie->Mouvement(5, $rue);
echo '<br />';
$medor->Mouvement(5, $rue);
Je viens de trouver une solution à mon souci, une vrai ^^

En passant les function bonjour de private à protected cela fonctionne parfaitement.

J'ai vraiment des soucis pour savoir quand utiliser protected à la place de private parfois j'avoue...

edit :
@Stealth35
désolé si mon premier message était peu clair, je n'avais pas indiqué le code en entier, mais juste sa structure pour indiquer les liaisons qui me posaient souci, je pensais que ce serait suffisant.
maosalia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 02h12   #5
Invité de passage
 
Inscription : décembre 2010
Messages : 9
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 9
Points : 3
Points : 3
Salutation

La visibilité protected (pour les méthodes aussi bien que les attributs) s'utilise dès lors qu'il y a de l'héritage et que l'on souhaite que les méthodes dites "protégée" soit visible dans les classes filles.

La visibilité private ne rend visible un attribut/méthodes qu'à la classe où l'élément est déclaré

Et voilà
Cocoww est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 15h09   #6
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 461
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 461
Points : 2 548
Points : 2 548
Envoyer un message via Skype™ à rawsrc
Bonjour,

Je vais compléter la réponse de Cocoww :
tu peux aussi accéder aux membres privés d'une classe de l'extérieur à la seule condition qu'une classe (A) au sein d'une classe (B) soit de même nature que la classe contenante (A <=> B).

Bref un exemple vaut mieux qu'un long discours :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
 
class Foo {
 
   private $_text; // MEMBRE PRIVE
 
   function getText() {
      return $this->_text;
   }
 
   function test() {
      $f = new Foo();
      $f->_text = 'abc'; // ICI ON ACCEDE DIRECTEMENT A UN MEMBRE PRIVE DE $f
      return $f->getText();
   }
}
 
$n = new Foo();
$a = $n->test(); // $a = 'abc'
 
?>
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/03/2011, 14h34   #7
Invité de passage
 
Inscription : décembre 2010
Messages : 9
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 9
Points : 3
Points : 3
Citation:
Envoyé par Xysyo Voir le message
Bonjour,

Je vais compléter la réponse de Cocoww :
tu peux aussi accéder aux membres privés d'une classe de l'extérieur à la seule condition qu'une classe (A) au sein d'une classe (B) soit de même nature que la classe contenante (A <=> B).

Bref un exemple vaut mieux qu'un long discours :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
 
class Foo {
 
   private $_text; // MEMBRE PRIVE
 
   function getText() {
      return $this->_text;
   }
 
   function test() {
      $f = new Foo();
      $f->_text = 'abc'; // ICI ON ACCEDE DIRECTEMENT A UN MEMBRE PRIVE DE $f
      return $f->getText();
   }
}
 
$n = new Foo();
$a = $n->test(); // $a = 'abc'
 
?>
Je ne savais pas, merci pour l'explication
En revanche pardonne moi mais, ... je ne vois pas l'intérêt [direct] d'une telle implémentation!
Tu peux en dire plus silteplé ?
Cocoww est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 10h12   #8
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 461
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 461
Points : 2 548
Points : 2 548
Envoyer un message via Skype™ à rawsrc
Bonjour
Citation:
Envoyé par Cocoww Voir le message
Tu peux en dire plus silteplé ?
C'est clair que cela n'est pas très utile à première vue mais c'est pratique dans le cas où tu dois gérer par exemple une arborescence à l'aveugle (sans distinguer les noeuds des feuilles). Tu pars du principe que tout est de même nature et que les éléments s'imbriquent les uns dans les autres. Dans ce cas, lors de certains taitements il est bien plus propre (voire pratique) d'accéder directement à un attribut privé d'un élement en cours de rattachement que de passer par des mutateurs qui peuvent avoir des signatures très verbeuses juste pour modifier un attribut (vécu).

Mais je te rassure tu peux t'en passer.
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h13.


 
 
 
 
Partenaires

Hébergement Web