Accueil > Forum > > > > Polymorphisme: accéder à sois-même
Polymorphisme: accéder à sois-même
lundi 5 mai 2008 à 17:26:56 |
Polymorphisme: accéder à sois-même

GRenard
|
En PHP et en C++, il est possible de choisir à quelle classe on veut parler directement lors d'un polymorphisme this. remonte à l'enfant parent:: remonte au parent NameOfYourClass:: appelle directement la classe en question Alors voici l'exemple j'ai A -> B -> C A étant une classe mère abstraite B étant la fille de A et abstratite C étant la fille de B et NON abstraite Chacun implémente la méthode "calculate()" avec "virtual" et "override" J'instancie C dans une fonction de B j'appelle ceci : private void something() { this.calculate(); // Will call C base.calculate(); // Will call A // Comment appeler B.calculate() ? }Comme je disais, en PHP je ferais : B::calculate(), même chose en C++... Alors en C# ? J'ai joué avec les virtual, override et new keyword pour les méthodes, mais je ne veux pas perdre mon principe de polymorphisme avec mon this, je veux seulement appeler ma méthode sur B directement dans ce cas ci. Merci [ Lien ]
|
|
lundi 5 mai 2008 à 17:59:44 |
Re : Polymorphisme: accéder à sois-même

jesusonline
|
[Je redirige vers csharpfr.com tu auras surement plus de retour] Conceptuellement parlant je trouve ca "choquant" de faire un A::calculate() dans C, dans ce cas l'héritage n'a pas vraiment de sens puisqu'il y aurait un saut d'héritage. Dans ton exemple base.calculate() n'est pas équivalent à A::calculate() mais plutot à B::calculate(), le mot clé base se refere à la classe parente et pas la classe orginal (sauf si évidement la méthode calculate n'est pas surchargé dans B ce qui n'est pas le cas). En tout cas, je ne connais pas de façon de faire ce que tu demandes en C# (à part utiliser la reflection ce qui est beurk). Mais je ne pense pas que ca manque en C#, au contraire même ... Cyril - MSP - MCPD ASP.net & MCTS SQL - Consultant indépendant
|
|
lundi 5 mai 2008 à 18:38:22 |
Re : Polymorphisme: accéder à sois-même

bubbathemaster
|
Si ce sont des méthodes statiques tu peux faire A.Calculate() B.Calculate() de partout, mais bon, essaye plutot de repenser ton code.
|
|
lundi 5 mai 2008 à 20:05:35 |
Re : Polymorphisme: accéder à sois-même

GRenard
|
Voici un morceau de code Si vous ne savez pas, ne répondez pas "pense ton code différemment". Je sais très bien que si ne ne trouve pas de solution, je vais prendre cette option. // A public virtual int calculate(){ int val = 10; return val; }
protected abstract void doSomething();
// B public override int calculate() { int val = base.calculate(); val += 2; return val; }
protected override void doSomething() { // ICI $valTotal = $this.calculate(); // 5+2+10 // Je souhaite avoir seulement 12 (10+2) // $valHere = B.calculate(); // pour finalement faire // $valTotal - $valHere => 5 }
// C public override int calculate() { int val = base.calculate(); val += 5; return val; }
public childMethod() { doSomething(); }
C c = new C(); c.childMethod();Regardez la méthode B.doSomething()Cherchez, Essayez et Testez avant de Poser une question ! [ Lien ]
|
|
lundi 5 mai 2008 à 20:45:06 |
Re : Polymorphisme: accéder à sois-même

jesusonline
|
Inutile d'être agressif ! Ce n'est pas possible en C# est je pense une réponse tout à fait acceptable et qui permet de te faire avancer. Comme je n'ai pas la prétention de tout savoir sur tout, je ne voulais pas être catégorique. Je comprend parfaitement ce que tu demandes (c'est d'ailleurs rare que les questions soient aussi bien posées ;-)). Mais selon moi, conceptuellement ce n'est pas correcte. Si tu surcharges c'est pour changer le comportement de ta classe, ce que tu voudrais c'est que l'instance de C se comporte de temps en temps comme une instance de C et parfois comme une instance de B. On pourrait esperer que caster this en B au niveau de l'appel de calculate resoudrais le problème, mis C# ne fonctionne pas comme ça, et heureusement car je ne trouverais pas ca propre. Cette histoire de cast me fait penser à l'implémentation explicite des interfaces, mais je ne vois pas en quoi cela pourrait t'aider (meme en rien du tout). Mis à part la reflexion, je ne vois pas de solution, et je trouves que ce tu cherches à faire n'est pas la facon la plus élégante de faire (conceptuellement parlant). Cyril - MSP - MCPD ASP.net & MCTS SQL - Consultant indépendant
|
|
lundi 5 mai 2008 à 21:18:59 |
Re : Polymorphisme: accéder à sois-même

GRenard
|
Je n'étais pas agressif en tant que tel. Si tu exprimes ton point, tout est OK. Si tu fais juste répondre à la réponse en disant "bad design", ça je trouve cela inutile. --- Je vois, je ne crois pas que le fait de dire que c'est un mauvais design peut arranger les choses... Si j'avais mis des virtual et new virtual et des choses comme ça que C# supporte. Vous auriez surement dit "Oh my god, c'est vraiment mélangeant tout ça". Alors pourquoi C# le supporte? Il y a des méthodes différentes de programmer et certaines sont plus efficaces que d'autres je l'admet mais si un langage supporte quelque chose, c'est parce que c'est possible de le faire.
for(int i = 0; i < myArray.Length; i++) { if(myArray[i] == false) { continue; } otherArray[i] = "PASS"; }
Pourquoi l'avoir codé ainsi plutôt que d'avoir fait for(int i = 0; i < myArray.Length; i++) { if(myArray[i] == true) { otherArray[i] = "PASS"; } }
Peut être que dans la logique de ma méthode, les personnes dans mon entreprise qui liront mon code comprendrons mieux le premier code que le 2e et ce sera plus facile de faire une mise à jour. J'ai écrit tout ça pour dire que... mauvais design ou non, tout le monde ne code pas comme nous :)
Pour en revenir à nos moutons, s'il n'y a vraiment pas de keyword pour accéder à ma méthode, je vais modifier le design.
|
|
mardi 6 mai 2008 à 10:17:25 |
Re : Polymorphisme: accéder à sois-même
|
mardi 6 mai 2008 à 13:15:50 |
Re : Polymorphisme: accéder à sois-même

leprov
|
il est une solution peu propre et qui risque de te poser des problemes de polymorphisme. si B n'override pas la method mais en fait un new, alors dans ta classe C, base.Calculate appelera A.Calculate, this.Calculate appelra C.calculate, et ((B)this).calculate appelera B.Calculate. Attention cependant, cette méthode est risquée et tu dois prendre en compte les conséquences de cette méthode sur la résoltuion des méthodes virtuelles dans le reste de ton code (si tu utilise le polymorphisme, sinon pas de soucis). Ca fonctionne, et je ne suis pas choqué outre mesure conceptuellement parlant (A part le fait que niveau maintenabilité cest pas terrible, et que ca force a se poser bcp de questions a chaque fois que tu vas utiliser tes objets et le polymorphisme).
|
|
mardi 6 mai 2008 à 13:17:32 |
Re : Polymorphisme: accéder à sois-même

leprov
|
sauf erreur de ma part (validé la réponse trop vite), car je ne suis pas entièrement sur qu'il soit possible d'override calculate dans C si B fait un new sur la méthode (je ne sais pas exactement quel choix a été fait a ce niveau, sachant que les deux possibilités sont logiques et acceptables)
|
|
mardi 6 mai 2008 à 13:23:34 |
Re : Polymorphisme: accéder à sois-même

leprov
|
autre solution (pardon pour le poste multiple), ne rien mettre en virtual, tout en new, et a ce moment tu peux appeler en préfixant dirrectemnt (cest a dire this.calculate, A.Calculate, B.Calculate). je pense que dans ce cas base.calculate appelera B.calculate dans ce cas. cependant le polymorphisme est alors totalement impossible. et en tapant ca je me rend compte que je dis probablement une connerie dans mon premier post car le new doit probablement supprimer le virtual
|
|
Cette discussion est classée dans : directement, classe, accéder, polymorphisme, calculate
Répondre à ce message
Sujets en rapport avec ce message
Accéder à une textbox depuis une classe [ par el_teedee ]
Bonjour, bonjour, est-ce que qqln pourrait m'expliquer comment on fait pour, depuis une classe, rajouter du texte dans une textbox ? Je ne peux pas y
Polymorphisme [ par redpooka ]
Comment fait-on du polymophisme ?Par exemple une classe C hérite de la classe A et B ?
Accéder à une classe d’un autre assembly [ par Souliabdo ]
Bonjour, J’ai une e solution qui contient deux projets, mon problème est que je n’arrive pas à accéder, depuis le projet de démarrage, aux classes d
Accéder à une textBox depuis une autre classe [ par nicolson ]
Salut tout le monde :)En fait, je veux rajouter une phrase à une textbox depuis une autre classe que Form1.Si ma classe Test hérite de Form1, je peux
Acceder aux champs d une classe [ par RhinoReno ]
Bonjour,j aurais besoin de savoir comment on peut acceder aux champs d'une classe a partir d'une fonction generee dans les events car moi g des erreur
[CONCOURS] Question sur les droits [ par webboy ]
Salut tout le monde,J'ai une question concernant les droits d'auteurs et (c)Je vais prendre l'exemple de la msdn..Je cherche comment faire quelque cho
Pb de débutant... [ par gferrier ]
Je débute et ce doit être en fait très simple...j'ai une classe Form1 contenant une case à cocher (cbEssai).si je fais un test dans cette classe lors
Goto et LBL & classe [ par kaiwoo ]
Sur calculette, il existe un fonction goto et lbl........ En fait, ca marche comme ca : LBL c'est le point de depart ... Quand le prgm arrive sur goto
dialogue C++ - C# [ par rintchu ]
Salut,j'ai dans un meme projet une classe C++ form12et une classe C# form1.Je voudrais apartir de form1 creer une instance de form12 , est ce possible
classe static dans classe static [ par linx20 ]
Voila en gros je veux inclure une classe static ds mon autre classe static : public abstract class MaClasseStatic1{public static MaClasseStatic2 st2;/
Livres en rapport
|
Derniers Blogs
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 LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
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
|