IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Héritage d'une méthode de classe.


Sujet :

Langage Perl

  1. #1
    Membre habitué

    Homme Profil pro
    Statisticien
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Points : 134
    Points
    134
    Par défaut Héritage d'une méthode de classe.
    Bonjour,

    J'ai dans mon programme principal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    sub selectAll {
        deselect();    
        Epingle::selectAll();
        Line::selectAll();
        Linepique::selectAll();
        Trait::selectAll();
        Curve::selectAll();
        calcul_selectionne_multiple();
        return;
    }
    Et dans chaque package .pm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sub selectAll {
        foreach my $liste (values %liste) {
            $liste->selectionne();
        }
    }
    Toutes ces .pm hérite d'un Commun.pm
    J'ai donc essayé de virer la méthode dans chaque .pm, et d'en mettre une commune dans Commun.pm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sub selectAll {
        my $class=shift;
        foreach my $liste (values %$class::liste) {
            $liste->selectionne();
        }
    }
    Au dela de savoir si elle est bien écrite, le fait est que ca ne fonctionne pas, car il ne trouve pas Epingle::selectAll
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tk::Error: Undefined subroutine &Epingle::selectAll called at ./dentelle.pl line 1093.
    Donc, comment faire pour hériter d'une méthode de classe ? (si j'ai bien compris mon problème)

    Bien le merci.

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    A mon avis, tu ne peux pas hériter "automatiquement" des méthodes de classes.
    Tu dois définir dans chaque classe la méthode de classe selectAll, éventuellement en faisant appel à la méthode de Commun.pl:

    dans package.pm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sub selectAll {
      return SUPER::selectAll(%liste);
    }
    et dans Commun.pm:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sub selectAll {
      my ($class) = shift;
      my %liste = @_;
     
      #...
    }
    Avis à prendre au conditionnel, car je ne suis pas super expert perlOO
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  3. #3
    Membre habitué

    Homme Profil pro
    Statisticien
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Points : 134
    Points
    134
    Par défaut
    Ca marche pas, mais ça inspire, j'ai donc modifié en mettant dans les .pm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sub selectAll {
        return Commun::selectAll(%liste);
    }
    et dans Commun.pm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sub selectAll {
        my %liste = @_;
        foreach my $liste (values %liste) {
            $liste->selectionne();
        }
    }
    C'est mieux, ça fonctionne, mais ça reste lourd...

  4. #4
    Membre habitué

    Homme Profil pro
    Statisticien
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Points : 134
    Points
    134
    Par défaut
    On avance,... dans mon fichier principal, je fais l'appel par
    Et dans Commun.pm (et je ne passe plus pas les divers .pm)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    sub selectAll {
        my $class = shift;
    print " $class "; # il imprime bien "Line" 
        foreach my $liste (values %liste) {
            print "selectAll-selectionne";
            $liste->selectionne();
        }
    }
    Et la boucle foire, tel quel %liste n'existe pas car défini dans le module Line.pm, et j'ai une erreur au lancement (use strict évidemment)
    Si je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      foreach my $liste (values %Line::liste) {
    Ca fonctionne mais que pour "Line" évidemment.
    J'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      foreach my $liste (values %$class::liste) {
      foreach my $liste (values %{$class}liste) {
    Aucun ne marche, je n'y croyait pas trop, mais bon.

    Une idée (je crois que j'ai déjà écrit ça) ?

  5. #5
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut
    Citation Envoyé par alainbb Voir le message
    Une idée (je crois que j'ai déjà écrit ça) ?
    Pas plus, mais juste pour l'inspiration la partie héritage du tuto de Tom Christiansen... ( ton post a au moins le mérite de me faire pencher dessus, j'en fais jamais sinon...)

    @+
    Mr6

  6. #6
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Je parle également d'héritage ici. Tu peux t'en inspirer.

  7. #7
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Ne faudrait-il pas mettre à jour cette partie pour y introduire "parent", qui par ailleurs, est préconisé par rapport à "base" (sauf dans le cas de l'usage du pragma fields, ne me demandez pas pourquoi, c'est juste écrit dans la doc de "base") ?

    Le module "parent" a par ailleurs l'avantage (par rapport à "base") de permettre qu'une classe et ses dérivées occupent le même fichier .pm (en utilisant l'option -norequire).
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  8. #8
    Membre habitué

    Homme Profil pro
    Statisticien
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Points : 134
    Points
    134
    Par défaut
    On avance...
    Dans mon fichier principal je mets

    Dans chaque .pm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sub getListe {
        my $self=shift;
        return %liste;
    }
    (avec une fâcheuse habitude de mélanger l'anglais et le français "getListe" :-)

    Et dans Commun.pm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    sub selectAll {
        my $class=shift;
        my %liste=$class->getListe();
        foreach my $liste (values %liste) {
            $liste->selectionne();
        }
    }
    Bon, le code dans chaque .pm se répète encore, mais c'est un moindre mal, vu que je peux implémenter d'autres fonctions du style deleteSelect, etc... sans plus devoir rajouter x fois le code dans chaque .pm

Discussions similaires

  1. Réponses: 5
    Dernier message: 18/09/2008, 17h20
  2. Réponses: 3
    Dernier message: 15/12/2006, 16h14
  3. Réponses: 4
    Dernier message: 29/01/2006, 17h54
  4. [C#] Ajout d'une méthode à la classe DropDownList
    Par Scorff dans le forum ASP.NET
    Réponses: 2
    Dernier message: 30/08/2005, 14h23
  5. Problème d'héritage d'une méthode protégée
    Par shenron666 dans le forum C++
    Réponses: 9
    Dernier message: 28/04/2005, 23h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo