Polymorphisme et fonctions / méthodes
PerlGirafe
-
-
-
Bonjour tout le monde, et bonne année 2013, meilleurs voeux :)
Je cherche à définir deux méthodes dans une classe (package) du même nom, qui ont un comportement plus ou moins similaire, mais avec des spécificités. Les méthodes se nomment "Add", ma classe "TestObject".
Comme le montre le code, je cherche a appeler deux versions différentes de Add() si j'ai un ou deux arguments.
J'ai fais pas mal de recherche, je n'ai rien trouvé. Donc je viens vous demander votre aide :D
J'ai l'habitude du C++, donc mon raisonnement est certainement influencé par ça... malheureusement :p
Je cherche à définir deux méthodes dans une classe (package) du même nom, qui ont un comportement plus ou moins similaire, mais avec des spécificités. Les méthodes se nomment "Add", ma classe "TestObject".
package TestObject; ... sub Add { my($this, $data) = @_; ... } sub Add { my($this, $data, $position) = @_; ... }
Comme le montre le code, je cherche a appeler deux versions différentes de Add() si j'ai un ou deux arguments.
J'ai fais pas mal de recherche, je n'ai rien trouvé. Donc je viens vous demander votre aide :D
J'ai l'habitude du C++, donc mon raisonnement est certainement influencé par ça... malheureusement :p
A voir également:
- Polymorphisme et fonctions / méthodes
- Fonction si et - Guide
- Codes secrets Android : accéder aux fonctions cachées - Guide
- Fonctions excel en anglais - Guide
- Virginie organise un rallye avec 30 équipes. elle veut créer un code pour désigner chaque équipe. elle a commencé à la main, mais elle voudrait le faire calculer à l'aide d'une formule. proposez une formule comportant une seule fonction et à recopier vers le bas dans la colonne a du fichier à télécharger. quelle formule sera en a9 ? ✓ - Forum Excel
- Fonctions excel - Guide
2 réponses
Tu ne peux pas créer deux fonctions (méthodes) avec le même nom dans un même espace de nommage (Package définissant ta classe).
Tu as (au moins) deux choix :
1- tu définis une seule méthode Add dans TestObject, qui agit différemment selon le nombre de paramètres passés
2- tu définis un autre objet TestObject::Special, qui hérite de TestObject, et qui définit une méthode Add avec ses spécificités.
Voilà un exemple qui illustre ces deux façons de faire :
Cela produit le résultat suivant :
Dal
Tu as (au moins) deux choix :
1- tu définis une seule méthode Add dans TestObject, qui agit différemment selon le nombre de paramètres passés
2- tu définis un autre objet TestObject::Special, qui hérite de TestObject, et qui définit une méthode Add avec ses spécificités.
Voilà un exemple qui illustre ces deux façons de faire :
#!/usr/bin/perl package TestObject; use strict; use warnings; sub new { my $class = shift; my $number = shift; my $self = {}; bless( $self, $class ); $self->{num} = $number; print "Initialized self->{num} = $self->{num}\n"; return $self; } sub Add { my $self = shift; my $data; my $position; print "I am a TestObject\n"; my $param_count = @_; if ($param_count == 1) { $data = shift; print "Only one parameter was passed\n"; print "doing something with data = $data\n"; $self->{num} += $data; } elsif ($param_count == 2) { $data = shift; $position = shift; print "Two parameters were passed\n"; print "doing something with data = $data and position = $position\n"; $self->{num} += $data * $position; } else { print "Error: wrong number of parameters"; } print "ending Add, the object holds self->{num} = $self->{num}\n\n"; } package TestObject::Special; use strict; use warnings; @TestObject::Special::ISA = qw(TestObject); sub Add { my $self = shift; print "I am a TestObject::Special, Add takes 2 arguments only here\n"; my $param_count = @_; if ($param_count == 2) { my $data = shift; my $position = shift; print "doing something with data = $data and position = $position\n"; $self->{num} += $data * $position; } else { print "Error: wrong number of parameters"; } print "ending Add, the object holds self->{num} = $self->{num}\n\n"; } package main; use strict; use warnings; my $thing1 = TestObject->new(12); my $thing2 = TestObject->new(12); my $thing3 = TestObject::Special->new(12); $thing1->Add(3); $thing2->Add(3,2); $thing3->Add(3,2);
Cela produit le résultat suivant :
$ ./PerlGirafe.pl Initialized self->{num} = 12 Initialized self->{num} = 12 Initialized self->{num} = 12 I am a TestObject Only one parameter was passed doing something with data = 3 ending Add, the object holds self->{num} = 15 I am a TestObject Two parameters were passed doing something with data = 3 and position = 2 ending Add, the object holds self->{num} = 18 I am a TestObject::Special, Add takes 2 arguments only here doing something with data = 3 and position = 2 ending Add, the object holds self->{num} = 18
Dal
Merci beaucoup pour ta réponse.
C'est dommage que Perl ne permette pas un polymorphisme aussi évolué que le C++. J'espère que ce manque (à mon sens tout du moins) sera comblé dans de futur versions... (au pire, j'ai python, mais bon...)
La première solution est celle que j'avais retenue pour avancer dans mon code, mais je la trouvais un peu "salle". L'idée d'appeler une methode intermediaire me déplait, mais apparemment, je n'ai guère le choix, vu que je veux produire un code simple, sans avoir besoin de créer d'objets dérivés pour deux ou trois méthodes...
En tout cas, merci encore de ta réponse :D
C'est dommage que Perl ne permette pas un polymorphisme aussi évolué que le C++. J'espère que ce manque (à mon sens tout du moins) sera comblé dans de futur versions... (au pire, j'ai python, mais bon...)
La première solution est celle que j'avais retenue pour avancer dans mon code, mais je la trouvais un peu "salle". L'idée d'appeler une methode intermediaire me déplait, mais apparemment, je n'ai guère le choix, vu que je veux produire un code simple, sans avoir besoin de créer d'objets dérivés pour deux ou trois méthodes...
En tout cas, merci encore de ta réponse :D