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)

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

Membre Club Administrateur CodeS-SourceS
[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

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

sebmafate

Membre Club Administrateur CodeS-SourceS

clair que conceptuellement c'est inutile !

en C#, on a seulement :
- this. : instance courante
- base. : type ancestre de l'instance.

Maintenant, ce n'est pas parce que PHP le fait que c'est quelque chose de bien.
Dans ton exemple, tu sembles vouloir implémenter le pattern "Chain Of Responsability" : [ Lien ]




Sébastien FERRAND (blog)
Consultant Sénior
[Microsoft Visual C# MVP]


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




1 2

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 {


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, 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
Temps d'éxécution de la page : 0,187 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.