begin process at 2012 05 31 20:00:51
  Trouver un code source :
 
dans
 
Accueil > Forum > 

PHP

 > 

POO

 > 

Classes & Objets

 > 

Surcharge d'une fonction abstraite


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Surcharge d'une fonction abstraite

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

codefalse

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS
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;
}
?>

1 2

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..


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,856 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales