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 :

objet : héritage multiple


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Par défaut objet : héritage multiple
    Bonjour,
    j'ai quelques soucis a propos de l'heritage multiple.
    Suite aux tutoriaux, j'utilise le code suivant pour appeler 2 autres classes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #!/usr/bin/perl
     
    package Probe::Main;
    use warnings;
    use strict;
    use Carp;
    use Data::Dump qw(dump);
    use base qw( Probe::Data Probe::Design );
    Dans chacune de ces classes, j'ecris un print à la 1ere instruction de la fonction new :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    #dans Main.pm :
    sub new {
      print "new main\n";
      my ( $class, $ref_arguments ) = @_;
      $class = ref($class) || $class;
      my $this = $class->SUPER::new($ref_arguments);
      bless( $this, $class );
      return $this;
    }
     
    #dans Data.pm :
    sub new {
      print "new data\n";
      my ( $class, $ref_arguments ) = @_;
      $class = ref($class) || $class;
      my $this = {};
      bless( $this, $class );
      return $this;
    }
     
    #dans Design.pm :
    sub new {
      print "new design\n";
      my ( $class, $ref_arguments ) = @_;
      $class = ref($class) || $class;
      my $this = $class->SUPER::new($ref_arguments);
      bless( $this, $class );
      return $this;
    }
    Ceci n'affiche que :
    new main
    new data

    Donc design ne se charge pas ?
    Je ne comprends pas pourquoi, ayant utilisé base comme expliquer dans les tutoriaux : http://djibril.developpez.com/tutori...rl/poo/#LB-6-b

    Merci de votre aide
    Z.

  2. #2
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Quel est ton script principal. Comment crée tu tes objets, peux tu nous montrer tes codes au complet ?

  3. #3
    Membre émérite
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Par défaut
    Merci djibril pour ton aide

    j'ai reproduis le souci avec le minimum de lignes :

    probe.pl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/usr/bin/perl
     
    use warnings;
    use strict;
    use Carp;
    use Data::Dump qw(dump);
    use Probe::Main;
     
    my $Probe = Probe::Main->new();
    Data.pm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #!/usr/bin/perl
     
    package Probe::Data;
    use warnings;
    use strict;
    use Carp;
    use Data::Dump qw(dump);
     
    sub new {
      print "new data\n";
      my ( $class, $ref_arguments ) = @_;
      $class = ref($class) || $class;
      my $this  = {};
      bless( $this, $class );
      return $this;
    }
     
    1;
    __END__
    Design.pm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #!/usr/bin/perl
     
    package Probe::Design;
    use warnings;
    use strict;
    use Carp;
    use Data::Dump qw(dump);
     
    sub new {
      print "new design\n";
      my ( $class, $ref_arguments ) = @_;
      $class = ref($class) || $class;
      my $this  = {};
      bless( $this, $class );
      return $this;
    }
     
    1;
    __END__
    Main.pm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #!/usr/bin/perl
     
    package Probe::Main;
    use warnings;
    use strict;
    use Carp;
    use Data::Dump qw(dump);
    use base qw( Probe::Data Probe::Design );
     
    sub new {
      print "new main\n";
      my ( $class, $ref_arguments ) = @_;
      $class = ref($class) || $class;
      my $this = $class->SUPER::new($ref_arguments);
      bless( $this, $class );
      return $this;
    }
     
    1;
    __END__
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ perl probe.pl 
    new main
    new data

  4. #4
    Membre émérite
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Par défaut
    Je pense avoir le meme problème qu'ici http://www.perlmonks.org/?node=188985
    Une solution et d'empiler les creations d'objets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #!/usr/bin/perl
     
    package Probe::Main;
    use warnings;
    use strict;
    use Carp;
    use Data::Dump qw(dump);
    use base qw( Probe::Data Probe::Design );
     
    sub new {
      print "new main\n";
      my ( $class, $ref_arguments ) = @_;
      $class = ref($class) || $class;
      my $this = $class->Probe::Data::new($ref_arguments)->Probe::Design::new($ref_arguments);
      bless( $this, $class );
      return $this;
    }
     
    1;
    __END__
    Résutat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ perl probe.pl 
    new main
    new data
    new design

  5. #5
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Citation Envoyé par Zwiter Voir le message
    Je pense avoir le meme problème qu'ici http://www.perlmonks.org/?node=188985
    Une solution et d'empiler les creations d'objets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #!/usr/bin/perl
     
    package Probe::Main;
    use warnings;
    use strict;
    use Carp;
    use Data::Dump qw(dump);
    use base qw( Probe::Data Probe::Design );
     
    sub new {
      print "new main\n";
      my ( $class, $ref_arguments ) = @_;
      $class = ref($class) || $class;
      my $this = $class->Probe::Data::new($ref_arguments)->Probe::Design::new($ref_arguments);
      bless( $this, $class );
      return $this;
    }
     
    1;
    __END__
    Résutat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ perl probe.pl 
    new main
    new data
    new design
    Là, tu fais du multi constructeur, ce que je te déconseille, ça n'a absolument aucun intérêt, du moins pour toi qui débute.

  6. #6
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Bon, je t'explique.

    Dans ton .pl, tu as mis ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $Probe = Probe::Main->new();
    Donc tu fais appel à la classe Main. Dans Main.pm, il te print new main.
    Dans cette classe, tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    use base qw( Probe::Data Probe::Design );
     
    sub new {
      print "new main\n";
      my ( $class, $ref_arguments ) = @_;
      $class = ref($class) || $class;
      my $this = $class->SUPER::new($ref_arguments);
      bless( $this, $class );
      return $this;
    }
    La classe héritera des méthodes des classes Data et Design. Le constructeur de la classe Main fait appel à sa super CLASSE, donc à celui qui est hérité en premier. Dans ton cas, ce sera donc la classe Data. De ce fait, il te print new data et c'est tout. C'est pour ça qui tu as juste :
    $ perl probe.pl
    new main
    new data
    Mais ça ne veut pas dire que l'héritage n'a pas fonctionné, c'est juste que la classe design n'a pas été instanciée, et ça n'a aucune importance. Si tu n'es pas persuadé de ce que je te dis, rajoute cette méthode dans la classe design.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    sub bonjourdesign {
      my $this = shift;
     
      print "bonjour c'est design";
     
      return;
    }
    et dans probe.pl, rajoute cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $Probe->bonjourdesign();
    Tu verras que l'héritage fonctionne à merveille

  7. #7
    Membre émérite
    Profil pro
    Assistant recherche bioinformatique
    Inscrit en
    Novembre 2007
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant recherche bioinformatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 877
    Par défaut
    Le souci est que si la classe n'est pas instanciée, je n'ai donc pas acces aux variables de cette classe, qui devraient être héritées :

    Design.pm :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #!/usr/bin/perl
     
    package Probe::Design;
    use warnings;
    use strict;
    use Carp;
    use Data::Dump qw(dump);
     
    sub new {
      print "new design\n";
      my ( $class, $ref_arguments ) = @_;
      $class = ref($class) || $class;
      my $this  = {};
      bless( $this, $class );
      $this->{DESIGN} = 'bla !';
      return $this;
    }
     
    1;
    __END__
    Data.pm :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #!/usr/bin/perl
     
    package Probe::Data;
    use warnings;
    use strict;
    use Carp;
    use Data::Dump qw(dump);
     
    sub new {
      print "new data\n";
      my ( $class, $ref_arguments ) = @_;
      $class = ref($class) || $class;
      my $this  = {};
      bless( $this, $class );
      $this->{DESIGN} = 'blo !';
      return $this;
    }
     
    1;
    __END__
    Et probe.pl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/perl
     
    use warnings;
    use strict;
    use Carp;
    use Data::Dump qw(dump);
    use Probe::Main;
     
    my $Probe = Probe::Main->new();
     
    print $Probe->{DESIGN}, "\n";
    print $Probe->{DATA}, "\n";
    Affichage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ perl probe.pl 
    new main
    new data
    blo !
    Use of uninitialized value in print at probe.pl line 12.
    Souci

  8. #8
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Déjà :
    1- Pourquoi ne pas gérer cela via Main.pm
    2- Généralement, on crée des accesseur et mutateur pour travailler proprement.
    3- Tu as déjà un souci de conception, dans design.pm et data.pm ton attribut à le même nom DESIGN, donc de toute façon, ils s'écraseront.

    Avant de se lancer dans la POO, il faut réfléchir à ce que tu souhaites faire, faire des schémas, sinon, c'est la panacée.

Discussions similaires

  1. Objet Query avec un héritage multiple
    Par QAYS dans le forum Langage
    Réponses: 5
    Dernier message: 01/11/2007, 10h18
  2. [heritage][conception]héritage multiple en java!
    Par soulhouf dans le forum Langage
    Réponses: 9
    Dernier message: 25/08/2005, 20h03
  3. L'héritage multiple est-il possible en Delphi ?
    Par SchpatziBreizh dans le forum Langage
    Réponses: 8
    Dernier message: 30/06/2005, 11h30
  4. utilisez vous l'héritage multiple ?
    Par vodosiossbaas dans le forum C++
    Réponses: 8
    Dernier message: 13/06/2005, 20h25
  5. [XML Schemas]héritage multiple
    Par nicolas_jf dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 10/06/2003, 12h55

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