JeuWeb - Crée ton jeu par navigateur
[Réglé] Ajouter des méthodes génériques à chaque classe ? - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Réglé] Ajouter des méthodes génériques à chaque classe ? (/showthread.php?tid=1907)

Pages : 1 2


[Réglé] Ajouter des méthodes génériques à chaque classe ? - Sephi-Chan - 20-10-2007

Salut à tous,

Dans cette nouvelle tentative de me mettre à la POO, je cherche un moyen d'intégrer les méthodes d'une classe à plusieurs classes, sans pour autant les déclarer dans chaque classe.

Il semble qu'il y ai là dedans une histoire d'héritage, cependant je n'en suis pas sûr et mes quelques tests n'ont pas été concluants.

Par exemple, imaginons 2 fonctions génériques que je voudrais intégrer à plein d'autres classes : isValidName et isValidEmail.

Je voudrais que ces méthodes s'ajoutent à celles de la classe Account de manière transparente. C'est à dire que je puisse faire :
Code PHP :
<?php 
class Account {
public var
$accountName;
public var
$accountPassword;
public var
$accountEmail;

public function
__construct(){
// blablabla
}

public function
createAccount($accountName, $accountPassword, $accountEmail){
// blablabla
if(isValidName($accountName)){
// blablabla
}
}
}

Vous comprenez mon délire ? Comment je pourrais arriver à un tel résultat : pouvoir utiliser certaines fonctions (que je pourrais regrouper dans une classe DataControl) dans plusieurs méthodes sans m'embêter à les redéfinir à chaque fois.

J'espère que vous saurez m'aider, je vous remercie d'avance,


Sephi-Chan


RE: Ajouter des méthodes génériques à chaque classe ? - Loetheri - 20-10-2007

Tu crées une classe X ou Y qui tu vas devoir étendre continuellement.
Donc ici Account étend X. Account héritera de toutes les méthodes de X et il pourra les utiliser ainsi que les surcharger (Est-ce possible en php ?).


RE: Ajouter des méthodes génériques à chaque classe ? - Sephi-Chan - 20-10-2007

Il semble être possible de surcharger les méthodes en PHP.

Je vais avoir un problème de clarté en appliquant cette technique, non ? Au moment d'insancier mon objet pour pouvoir profiter des méthodes de la classe DataControl, je vais devoir faire :
Code PHP :
<?php 
$account
= new DataControl(); // Au lieu de : $account = new Account();

C'est un souci mineur je l'accorde, mais je voudrais savoir s'il n'y a pas un moyen plus clair de le fer, car si la clarté est le fer de lance de la POO, ça commence mal pour moi... :triste3:


Sephi-Chan


RE: Ajouter des méthodes génériques à chaque classe ? - Gordon - 20-10-2007

En effet, tu dois utiliser l'héritage, voici un exemple simple.
La class Account utilisera le isValidname de base, tandis que la class Palyer utilisera la version surchargée (qui appelle la version de base si le nom n'est pas vide).

Code PHP :
<?php 
class DataControl {
public function
isValidName($name) {
return
true;
}
}

class
Account extends DataControl{
public var
$accountName;
public var
$accountPassword;
public var
$accountEmail;

public function
__construct(){
// blablabla
}

public function
createAccount($accountName, $accountPassword, $accountEmail){
// blablabla
if($this->isValidName($accountName)){
// blablabla
}
}
}

class
Player {
public function
__construct( $name ) {
if(
$this->isValidName($name)) {
//traitement
}
}
public function
isValidName($name='') {
if(
$name=='') return false;

return
Parent::isValidName($name);
}
}



RE: Ajouter des méthodes génériques à chaque classe ? - Loetheri - 20-10-2007

Sephi-Chan a écrit :Je vais avoir un problème de clarté en appliquant cette technique, non ? Au moment d'insancier mon objet pour pouvoir profiter des méthodes de la classe DataControl, je vais devoir faire :
Code PHP :
<?php 
$account
= new DataControl(); // Au lieu de : $account = new Account();

Pourquoi ?
DataControl est dans Account. Donc il te suffit de faire :
Code PHP :
<?php 
$account
= new Account();
Si tu préfères Account hérite de toutes les méthodes et variables de DataControl. Account a accès à toutes les méthodes et variables de DataControl. C'est là le truc de l'héritage ^^


RE: Ajouter des méthodes génériques à chaque classe ? - Sephi-Chan - 20-10-2007

Merci Gordon, ça confirme que la surcharge est possible en PHP.

Edit :

Je comprends mal le sens de lecture de extends.

Quand j'écris :
Code PHP :
<?php 
class DataControl extends Account
Ca signifie quoi ?
  1. Que DataControl récupère les méthodes d'Account;
  2. Que Account récupère les méthodes de DataControl;


Sephi-Chan


RE: Ajouter des méthodes génériques à chaque classe ? - lanoix - 20-10-2007

Solution 1, que DataControl récupère les méthodes d'Account...

Tu ne pourras jamais faire "isValidName" sur un objet de la classe Account. Si tu "lis" toi même ce fichier d'ailleurs jamais tu ne trouveras une référence à cette fonction.
Tandis que quand tu "lis" (toi même toujours) le fichier avec la classe DataControl, tu trouves une référence vers une autre classe, que tu peux aller lire.
Tu vois ce que je voulais dire par là?

Comme l'exemple "Véhicule" > "Voiture" > "Ford Fiesta". Une Ford Fiesta est bien une voiture, est bien un véhicule... mais un véhicule n'est pas une Ford Fiesta. Ca peut, mais pas forcément. Si tu as une méthode "ouvrir le coffre" sur ta ford fiesta... Ce n'est pas pour autant que tu pourras le faire sur un autre "véhicule".


RE: Ajouter des méthodes génériques à chaque classe ? - Sephi-Chan - 20-10-2007

Donc ce que je veux faire, c'est à dire utiliser les méthodes de la classe DataControl de manière transparente dans ma classe Account (et dans d'autre), c'est impossible ?


Sephi-Chan


RE: Ajouter des méthodes génériques à chaque classe ? - naholyr - 20-10-2007

Bien sûr que si, si Account extends DataControl, comme les autres classes.

C'est vraiment intuitif en fait : tu définis la famille «DataControl» qui représente la famille des objets qui ont des fonctionnalités de contrôle de données.
Ensuite tu définis la famille «Account» qui représente la famille des comptes utilisateur. Un compte utilisateur ayant des fonctionnalités de contrôle de données, il est donc aussi de la famille «DataControl».
Même principe pour les personnages, a priori la famille «Character» aura aussi des fonctionnalités de contrôle de données, et sera donc aussi une classe fille de «DataControl», et on aura donc aussi Character extends DataControl.

Ça se traduit par le fait que «Account» «étend» les fonctionnalités de «DataControl» : il hérite des fonctionnalités de base de la classe-mère, et les étend en ajoutant les siennes propres.

Toujours l'exemple des voitures, la class "4x4" étend la classe "Voiture" puisqu'elle hérite de toutes les fonctionnalités d'une voiture (un moteur, des roues, un réservoir, un compteur kilométrique, etc… et des actions avancer, reculer, accélérer, etc…Wink, et qu'elle ajoute ses propres fonctionnalités (4 roues motrices) et redéfinit certaines des fonctionnalités de la classe parente (réservoir plus gros).

Je pense que tout ce qui te manque c'est d'arriver à choper la bonne manière de penser, qui est vraiment tout-à-fait intuitive et «normale». C'est dur pour un développeur (surtout auto-didacte, puisqu'on est encore plus habitué à bidouiller) de se mettre dans cet état d'esprit.
L'énorme manque dans la POO de PHP c'est l'absence de l'héritage multiple qui oblige parfois à redéfinir sa modélisation au lieu de suivre sa logique, mais ça tu t'y heurteras plus tard ça ne sert à rien de t'embrouiller de suite avec ça.


RE: Ajouter des méthodes génériques à chaque classe ? - Sephi-Chan - 20-10-2007

Ah oui, donc ça se comprend vraiment tel que ça se lit !

Maintenant en ce qui concerne l'utilisation de cette classe et de son extension, je peux m'en servir directement en instanciant la classe Account, qui peut ainsi utiliser en son sein les méthodes de la classe DataControl ?


Sephi-Chan