Page 1 sur 2
Agrégation d'objets
Posté : 29 oct. 2007, 15:09
par mcorgnet
Re-Bonjour,
Dans une classe parente, j'ai une méthode publique. J'aimerais que dans une des classes enfantes, elle ne soit plus accessible ... Pour l'instant, je l'ai surchargée dans la classe enfante, mais j'aurais voulu la rendre abstraite, ou faire le nécessaire pour qu'elle ne puisse plus être appelée à l'instanciation. Possible ?
Merci encore de votre aide.
Posté : 29 oct. 2007, 15:10
par Tracker
Il te faut la mettre "private" dans la classe mère.
Tracker.
Posté : 29 oct. 2007, 15:14
par mcorgnet
Hum,
dans ma classe mère, j'ai des méthodes privées et publiques. En instanciant la classe mère, j'ai besoin de pouvoir utiliser cette méthode. Par contre, c'est depuis la classe enfant que je voudrais la désactiver, sans la désactiver dans la classe mère ...
exemple :
<?php
// est possible
$mere = new mere();
$mere->test();
// est impossible
$enfant = new enfant();
$enfant->test();
?>
Voilà voilà ... J'ai essayé de redéfinir la classe en privé, depuis la classe enfant. De la rendre abstraite, également. Mais ça me renvoie toujours un message d'erreur ...
Posté : 29 oct. 2007, 15:20
par Tracker
Prouve qu'il existe une relation d'héritage entre tes deux classes (définis nous les deux objets).
Tracker.
Posté : 29 oct. 2007, 15:24
par mcorgnet
euh bon ... Je saisis mal l'intérêt, mais allons y.
<?php
class mere {
public function test() {
}
}
classe enfant extends mere {
// private ou abstract ne fonctionne pas,
// ça renvoie un message d'erreur.
public function test() {
}
}
La relation existe, ce que je veux, c'est renvoyer une erreur sans passer par les exceptions lorsque j'appelle la methode this->test depuis la classe enfant.
Posté : 29 oct. 2007, 15:39
par Tracker
Tu n'as pas dû saisir ma question, pour que B extends A, il faut que B soit une spécialisation de A (qu'un B soit aussi un A), si une telle relation n'existe pas dans la nature des objets que tu essaies de définir, ce n'est pas un héritage qui te permettra de les décrire.
Pareil pour l'autre post que tu as en cours, détaille nous le but, donne le nom de objet, leur responsabilité... Sinon on reste dans un flou conceptuel vaseux qui ne va surement pas te faire avancer.
Tracker.
Posté : 29 oct. 2007, 15:45
par mcorgnet
Je définis des objets php pour mes formulaires.
La classe mère représente un formulaire. Les classes enfant des objets du formulaire (exemple un champs input), qui dépendent du formulaire instancié.
Lorsque je définis la methode setAction pour le formulaire, je voudrais que cette méthode ne soit plus disponible pour la classe etendue inputText.
Je précise que c'est un projet d'études, je dois donc le faire au mieux, à vrai dire.
Posté : 29 oct. 2007, 15:47
par Tracker
...La classe mère représente un formulaire. Les classes enfant des objets du formulaire (exemple un champs input), qui dépendent du formulaire instancié...
Voilà tu as tout dit, "un champ" n'est pas un "formulaire", point à la ligne...
Donc oublie extends...
Tracker.
Posté : 29 oct. 2007, 15:50
par Tracker
Dans ton contexte tu vas obtenir:
Une classe Form (contenant des Input)
Une classe Input (Abstraite avec des méthod genre get/setValue)
Et une liste de classes étendant Input comme:
- InputText (pour un champ text)
- InputSelect ( ... )
- ...
Mais nullepart d'héritage entre Form et Input, désolé. Tu as une mauvaise vision/représentation de ce qu'est une classe, une instance, un héritage, une agregation... Essaie de débrouiller ces notions avant de commencer.
Tracker
Posté : 29 oct. 2007, 15:53
par mcorgnet
Non mais ça me convient, je peux faire ainsi.
Et en admettant que le problème se pose à nouveau, entre la classe input et la class text, par exemple. D'une méthode que je veux appeler de la classe mère seulement, et pas de la classe enfant, pour répondre à ma question originale. Est-ce possible, sans la surcharger ?
Posté : 29 oct. 2007, 15:57
par Tracker
Si ça devait arriver, c'est qu'il y aurait une boulette dans ton schéma de classe.
Comme si tu disais faisait une classe Voiture (qui tourne), et qu'un type de voiture ne tourne pas ?!
Ca veut dire qu'il marque des niveaux d'héritages, comme:
Voiture
VoitureTournante extends Voiture
VoitureNonTournante extends Voiture
LaVoitureEnQuestion extends VoitureNonTournante
Il faut revoir à ce moment l'architecture.
[edit]
Pour terminer:
Si B extends A, B est complètement un A (pas partiellement)
Tracker.
Posté : 29 oct. 2007, 16:23
par Sékiltoyai
Je plussoie Tracker. Ton modèle de classes est mauvais, c'est de aggrégation qu'il te faut, pas de l'héritage. Tu dois définir une propriété $inputs dans ta classe de formulaires pour regrouper tous les inputs du formulaire, pas faire du pseudo héritage. Pour reprendre l'exemple de Tracker, si tu considères input et form de même type, ca veut dire que tu considèreras que le moteur de la voiture est une voiture aussi, avec quelques propriétés supplémentaires.
Sache que l'héritage est accessoire, il est rare d'en avoir besoin, par rapport à l'aggrégation.
Posté : 30 oct. 2007, 10:53
par mcorgnet
Je plussoie Tracker. Ton modèle de classes est mauvais, c'est de aggrégation qu'il te faut, pas de l'héritage.
Bon, j'ai bien compris ce que vous m'avez expliqué, dans l'ensemble. Maintenant, le problème qui se pose, c'est de comprendre l'agrégation. Les documentations que j'ai :
http://www.devshed.com/c/a/PHP/Object-I ... -part-1/4/
http://www.php.documentation.givah.net/ ... ation.html
Le problème, c'est que je ne comprends pas vraiment le principe, ce à quoi ça sert (puis l'article en anglais, faut tout comprendre, et c'est pas évident).
Ensuite, on m'a clairement demandé de lier mes objets à chaque fois que c'est possible (parce qu'en plus, il y a un cours d'intro à uml, et que le cours d'objet et le cours d'uml se croisent).
J'ai bien compris que ma classe de formulaires comportera les $inputs, $textareas, $selects. Mais dans des arrays ou des objects ?
Comme je ne connais pas encore uml, et que je ne saisis effectivement pas toutes les possibilités de l'objet, je me renseigne partout ou je peux, et j'ai du mal à sortir des diags de classes et tout ça ...
Merci de votre aide.
Posté : 30 oct. 2007, 11:05
par zeus
Le principe de l'héritage est le suivant : si A hérite de B, A est un B.
Le principe de l'agrégation est le suivant : Si A agrège au moins un B, c'est que A est compose d'au moins un B.
D'un point de vue conceptuel, tu es d'accord qu'un formulaire contient des champs. Il va donc te falloir une classe
Formulaire et une classe
Input
Dans ta classe Formulaire, tu vas créer la place, dans les attributs de classe, de pouvoir agréger des instances de la classe
Input.
class Formulaire
{
$a_inputs = array() // Liste des inputs associés à ce formulaire
// Permet d'agréger un nouvel input dans le formulaire courant
public function addInput( $o_input )
{
// Agrège le nouvel input dans l'attribut de classe $a_inputs
$this->a_inputs[ $o_input->getId() ] = $o_input;
}
// Récupère un input agrégé dans la classe
public functionj getInput( $id_input )
{
return $this->a_inputs[ $id_input ];
}
}
Posté : 30 oct. 2007, 11:36
par Tracker
... Bon, j'ai bien compris ce que vous m'avez expliqué, dans l'ensemble. Maintenant, le problème qui se pose, c'est de comprendre l'agrégation ...
En réalité la relation existant entre Champ et Formulaire n'est pas une agrégation mais une
composition.
L'exemple de Zeus t'explique parfaitement le principe en php, par contre en implémentant une agrégation, c'est pas forcement la meilleur solution: un même champs appartenant à deux formulaires n'a pas réellement de sens.
Pour comprendre le sens de ces termes regarde les exemples
ici.
Tracker.