|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
Sujet : Polymorphisme: accéder à sois-même [ Algorithme / Maths ] (GRenard)
Informations & options pour cette discussion
|
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é 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 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;/
Question Pour un debutant [ par rintchu ]
Bonjour,voila mon probleme : j'ai une classe A et une classe B et un attribut A1 dans la classe A. Ca donne ceci :class A{ int A1 ; class B {
Livres en rapport
|
Téléchargements
Logiciels à télécharger sur le même thème :
|