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 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
Livres en rapport
|
Derniers Blogs
TECHDAYS PARIS 2010 : PLEINIèRE DERNIER JOURTECHDAYS PARIS 2010 : PLEINIèRE DERNIER JOUR par ROMELARD Fabrice
Cette session est la dernière pleinière de ces 3 jours de TechDays Paris 2010. Généralement, cette troisième journée est plus axée sur l'avenir vu par Microsoft. Après un retour sur l'avenir vu par la Science Fiction ou par ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
Comparez les prix

HTC Magic
Entre 429€ et 429€
|