Accueil > Forum > > > > Surcharge d'une fonction abstraite
Surcharge d'une fonction abstraite
lundi 17 décembre 2007 à 15:11:41 |
Surcharge d'une fonction abstraite

codefalse
|
Bonjour à tous :) J'ai un petit soucis syntaxique, j'aimerai votre avis avant de continuer. J'ai une classe abstract class genericReader {} qui contient des fonction abstraites (par exemple read) Le truc, c'est que j'aurai une classe fille "file" et une classe fille "socket". class file extends genericReader classe socket extends genericReader Dans chaque classes filles, il se peux que j'ai, plus tard des classes filles. L'idée, c'est que je veux que la fonction read soit implémentée dans chaques classses instanciables (file, socket, etc). Mais je ne peux pas déclarer une classe read (); dans genericReader, et mettre dans class file extends genericReader une fonction read ($sPathToFile) et dans socket extends genericReader, une fonction read ($host, $port, $file); Comment faire cela ? Est-ce que je doit déclarer une fonction abstraite qui prendre le maximum de parametres (dans ce cas 3) et ignorer les deux autres dans la classe "file" ? Ou y-a-t-il une solution plus "logique" et surtout plus "performante"
|
|
lundi 17 décembre 2007 à 18:09:07 |
Re : Surcharge d'une fonction abstraite

malalam
|
Réponse acceptée !
Hello,
tu peux très bien utiliser func_get_args() et cie :
<?php abstract class A { abstract public function myFunc(); }
class B extends A { public function myFunc() { $aArgs = func_get_args(); if(count($aArgs) !== 1 || (isset($aArgs[0]) && !is_int($aArgs[0]))) { throw new Exception(__FUNCTION__.' required 1 parameter which must be an integer'); } echo 'B succeeded'; } }
class C extends A { public function myFunc() { $aArgs = func_get_args(); if(count($aArgs) !== 2 || (isset($aArgs[0]) && !is_int($aArgs[0])) || (isset($aArgs[1]) && !is_string($aArgs[1]))) { throw new Exception(__FUNCTION__.' required 2 parameter, the 1st one must be an integer and the second one must be a string'); } echo 'C succeeded'; } } try { $b = new B; $b->myFunc(); } catch(Exception $e) { try { $b->myFunc(5); $c = new C; $c->myFunc(5); } catch(Exception $exc) { $c->myFunc(5, 'toto'); echo $exc; } echo $e; } ?>
|
|
lundi 17 décembre 2007 à 19:33:13 |
Re : Surcharge d'une fonction abstraite

codefalse
|
J'y ai pensé, et faire aussi un list ($var1, $var2, etc), mais je me suis dit que ca allait alourdir le traitement et qu'il devait y avoir une méthode plus légére. C'est vraiment la meilleure méthode ? Et est-ce la bonne voie que j'emploi la ?
Merci en tout cas pour ta réponse Malalam :)
|
|
mardi 18 décembre 2007 à 13:55:52 |
Re : Surcharge d'une fonction abstraite

neigedhiver
|
Salut,
Je sais pas si c'est la meilleure méthode, mais les fonction func_get_args() et func_num_args() existent, c'est pour une raison : servir dans le cas d'arguments variables. C'est ton cas ici, autant les utiliser...
Et puis si c'est pas la meilleure méthode, pour ma part, je n'en vois pas d'autre...
|
|
mardi 18 décembre 2007 à 14:18:18 |
Re : Surcharge d'une fonction abstraite

codefalse
|
ok :) merci à vous alors, je vais m'atteler là-dessus ! :)
|
|
mardi 18 décembre 2007 à 19:12:40 |
Re : Surcharge d'une fonction abstraite

malalam
|
Boah, d'autres façons, il y en a, mais je ne suis pas sûr qu'elles soient moins lourdes. Par exemple...:-) :
<?php abstract class A { abstract public function myGenericFunc(FuncObj $o); }
abstract class FuncObj { protected $aParams; abstract public function mySpecificFunc(); }
class FuncObj1 extends FuncObj { public function __construct($aParams) { if(count($aParams) !== 1 || !isset($aParams[0]) || !is_int($aParams[0])) { throw new Exception('Params array must have only 1 entry wich must be an integer'); } $this->aParams = $aParams; } public function mySpecificFunc() { echo 'Param : '.$this->aParams[0]; } }
class FuncObj2 extends FuncObj { public function __construct($aParams) { if(count($aParams) !== 2 || !isset($aParams[0]) || !isset($aParams[1]) || !is_int($aParams[0]) || !is_string($aParams[1])) { throw new Exception('Params array must have only 2 e,tries, the 1st one being an integer and the 2d one being a string'); } $this->aParams = $aParams; } public function mySpecificFunc() { echo 'Param 1 : '.$this->aParams[0]. ' and param 2 :'.$this->aParams[1]; } }
class B extends A { public function myGenericFunc(FuncObj $o) { if(!$o instanceof FuncObj1) { throw new Exception('Object must be an instance of FuncObj1'); } $o->mySpecificFunc(); } }
class C extends A { public function myGenericFunc(FuncObj $o) { if(!$o instanceof FuncObj2) { throw new Exception('Object must be an instance of FuncObj2'); } $o->mySpecificFunc(); } }
try { $b = new B; $c = new C; $b->myGenericFunc(new FuncObj1(array(5))); $c->myGenericFunc(new FuncObj2(array(5, 'toto'))); $c->myGenericFunc(new FuncObj1(array(2))); } catch(Exception $e) { echo $e; } ?>
|
|
mardi 18 décembre 2007 à 19:16:10 |
Re : Surcharge d'une fonction abstraite

neigedhiver
|
Bah oui, j'avais bien pensé à ça, mais en fait, dans le principe, c'est pas bien différent : Dans ton premier exemple, on récupère les arguments dans un tableau avec func_get_args(), là, le tableau est tout prêt. Sinon, c'est pareil...
|
|
mardi 18 décembre 2007 à 19:26:04 |
Re : Surcharge d'une fonction abstraite

malalam
|
Tout à fait, sauf que là, en réalité, le principe ne serait pas d'avoir X objets étendant A, mais un seul...et son comportement varieraiot en fonction de l'objet de type FuncObj qu'on lui passerait. Qui lui, serait déterminé en fonction du contexte (bref, de la stratégie à adopter).
|
|
mardi 18 décembre 2007 à 20:45:08 |
Re : Surcharge d'une fonction abstraite

codefalse
|
perso je trouve la deuxieme méthode plus lourde :) et plus complexe à mettre en oeuvre, si on imagine que j'ai 5 niveau d'extends, avec à chaque fois des parametres différents, ca va faire beaucoup de classes en plus :p
|
|
mardi 18 décembre 2007 à 21:26:51 |
Re : Surcharge d'une fonction abstraite

malalam
|
bah oui, j'ai proposé l'autre d'abord hein lol. Mais celle-ci peut-être très utile dans ce cas-ci :
<?php abstract class A { abstract public function myGenericFunc(FuncObj $o); }
abstract class FuncObj { protected $aParams; abstract public function mySpecificFunc(); }
class FuncObj1 extends FuncObj { public function __construct($aParams) { if(count($aParams) !== 1 || !isset($aParams[0]) || !is_int($aParams[0])) { throw new Exception('Params array must have only 1 entry wich must be an integer'); } $this->aParams = $aParams; } public function mySpecificFunc() { echo 'Param : '.$this->aParams[0]; } }
class FuncObj2 extends FuncObj { public function __construct($aParams) { if(count($aParams) !== 2 || !isset($aParams[0]) || !isset($aParams[1]) || !is_int($aParams[0]) || !is_string($aParams[1])) { throw new Exception('Params array must have only 2 e,tries, the 1st one being an integer and the 2d one being a string'); } $this->aParams = $aParams; } public function mySpecificFunc() { echo 'Param 1 : '.$this->aParams[0]. ' and param 2 :'.$this->aParams[1]; } }
class B extends A { public function myGenericFunc(FuncObj $o) { $o->mySpecificFunc(); } }
try { $b = new B; $b->myGenericFunc(new FuncObj1(array(5))); $b->myGenericFunc(new FuncObj2(array(5, 'toto'))); } catch(Exception $e) { echo $e; } ?>
|
|
Cette discussion est classée dans : fonction, file, classe, read, genericreader
Répondre à ce message
Sujets en rapport avec ce message
fonction : execution de fichier sql [ par flagada42 ]
function execute_fichier_sql($chemin) { // Ouverture du fichier contenant les requètes SQL $file = fopen($chemin, "r"); //Tant que l'on est pa
move uploaded file [ par romalafrite ]
Salut à tous !Je cherche un bon tutos pour l'upload d'images utilisant les tableaux de valeurs $_FILES et la fonction move_uploaded_file de façon excl
pb avec ma classe [ par windu ]
voila, j'utilise 1 classe de connexion (MySQL), classe que j'appelle dasn mon fichier de connexion à la base. tout va bien il me suffit d'inclure ce f
Help fonction IF FILE EXIST [ par VANLOC ]
Bonjour a tous, J'ai une fonction du type :$temp = "images/produits/".$row_rsCatalogue['reference'].".htm";if(file_exists($temp)){ echo blablablaOu j
problème avec la fonction file() [ par drnicholas001 ]
Salut, jai un problème qui m'embette en php, jai cette partie de code :$url = "http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=sl1d1t1
mails avec pièces jointes [ par refkaben ]
Bonjour!j'ai trouvé dans les codes de phpcs une classe qui permet l'envoi des emails avec des pièces jointes.J'ai adapté la classe à mon cas, mais il
while sur fonction ! [ par fcdconnect ]
Voilà :comment rédiger un while pour afficher tous les résultat de cette fonction :function diraff($REP, $EXT){ $CPT="0"; $handle=opendir($REP);
fonction Autoload.... [ par Yemanjah ]
Bonjour , Après de multiples essais , je désespère et viens demander de l'aide ici.J'essaye de mettre en place un héritage et à vrai dire je cr
Probleme fonction is_file [ par CptPingu ]
Bonjour,Je possede un site sous free. Tout marchait bien, mais depuis quelques jours certaines fonctions ont l'air de ne plus fonctionner. Lorsque je
CLASS: Appel d'une fonction interne a la classe.. [ par josh666 ]
Bonjour à tous , J'essais d'appeler un function interne à une classe via une autre focntion de la classe mais jai une erreur de fonction non définie..
Livres en rapport
|
Derniers Blogs
ROSLYN FLUENT APIS: ROSLYNHELPER NUGET PACKAGEROSLYN FLUENT APIS: ROSLYNHELPER NUGET PACKAGE par Matthieu MEZIL
Si vous utilisez Roslyn et que vous vous voulez vous simplifier le code du code rewriter, je vous conseille d'installer mon NuGet package RoslynHelper ....(read more) ...
Cliquez pour lire la suite de l'article par Matthieu MEZIL POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|