begin process at 2010 02 10 12:42:55
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C#

 > 

Algorithme

 > 

Maths

 > 

Polymorphisme: accéder à sois-même


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

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

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é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 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 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 classe d'une table de la BDD [ par asma07 ] Bonsoir, Je veux savoir comment développer une classe d'une table d'une BDD SQL Server et comment utiliser cette classe.Quelle est l'utilité de cette accéder à une colonne d'une ligne sélectionnée dans listview [ par dourid9 ] Salut Comment je peux accéder à une colonne d'une ligne sélectionnée dans listview (par exp le répertoire)dans compact framework en C#, sachant que j comment accéder à un variable de type Object [ par dorras7 ] Bonsoir, j'ai une méthode qui retourne une variable de type Object Object ObjColl=GetCollection(); ObjColl c'est une collection des objets je veux acc Accéder à un label via un thread [ par ansizak ] Bonjour, Je débute dans l'utilisation des threads. Aussi j'ai réalisé une application dans laquelle un clic sur un bouton déclenche le lancement d'u


Nos sponsors


Sondage...

Comparez les prix


HTC Magic

Entre 429€ et 429€

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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 : 0,421 sec (4)

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