🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.perl
Article #52113

[OO] Wielokrotne dziedziczenie z jawnym wywołaniem konstruktorów klas bazowych z parametrami

#52113
From: Jarosław Lubczyński
Date: Wed, 15 Dec 2010 08:33
125 lines
3563 bytes
(przepraszam jeżeli ten list pojawi się drugi raz z nienacka, miałem 
drobne problemy z Grzmiącym Ptakiem)

Kolejny problem na jaki napotkałem w Perlu dotyczy wielokrotnego 
dziedziczenia.

Na początek napiszę kawałek kodu w c++ pokazujący o co mię się rozchodzi:

class A
{
public:
     A( int APar)
     {
         m_APar = APar;
     };
private:
     int m_APar;
};

class B
{
public:
     B( int BPar)
     {
         m_BPar = BPar;
     }
private:
     int m_BPar;
};

class C : public A, public B
{
public:
     C( int APar, int BPar) : A( APar), B( BPar)
     {
     };
};

Czyli: W klasie pochodnej wywołuję konstruktory obu klas bazowych 
przekazując do nich stosowne parametry.

A teraz chciałbym coś podobnego napisać w Perlu (kod działający):

{
    package A;
    sub new()
    {
        my( $class, $APar) = @_;
        my $self = { APAR => $APar};

        print( "Constructor called: A($APar)\n");

        bless( $self, $class);
    }
}

{
    package B;
    sub new()
    {
        my( $class, $BPar) = @_;
        my $self = { BPAR => $BPar};

        print( "Constructor called: B($BPar)\n");

        bless( $self, $class);
    }
}

# na razie chyba nie najgorzej. Teraz klasa C. I *problem*:

{
     package C;
     use base qw( A B);

     sub new
     {
         my( $class, $APar, $BPar) = @_;

         # dla pierwszej klasy bazowej nadal nie ma problemu:
         my $self = $class->SUPER::new( $APar);

         # zgodnie z deklaracją use base będzie
         # wywołany konstruktor klasy A.
         # A CO Z WYWOŁANIEM KONSTRUKTORA KLASY B???

         # można co prawda napisać tak (działa!):
         my $self_b = $class->B::new( $BPar);

         # ale jak potem zmerge'ować $self i $self_b ???
     }

}

my $c = C->new( 1, 2);

#
# EOF
#

No właśnie, jak to zrobić? I jak potem odwoływać się do:

1. Pól klas bazowych przy założeniu, że mają różne nazwy jak w 
przykładzie powyżej?
2. Pól/metod klas bazowych jeżeli mają w obu klasach identyczne nazwy, 
np. m_Par a metody dostępowe odpowiednio getPar i setPar?

-- 
Pozdrawiam
Jarek Lubczyński
(eljot<NULL>90125 at gmail dot com)
Nawiasy trójkątne z zawartością zbędne są

There are 10 kinds of people:
Those who understand binary and those who don't


-- 
Pozdrawiam
Jarek Lubczyński
(eljot<NULL>90125 at gmail dot com)
Nawiasy trójkątne z zawartością zbędne są

There are 10 kinds of people:
Those who understand binary and those who don't
Technical Details
Message-ID: <ie9uh2$qfj$1@opal.futuro.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!news.nask.pl!news.nask.org.pl!news.internetia.pl!opal.futuro.pl!not-for-mail

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!news.nask.pl!news.nask.org.pl!news.internetia.pl!opal.futuro.pl!not-for-mail
From: Jarosław Lubczyński <guess@who.com.pl>
Newsgroups: pl.comp.lang.perl
Subject: [OO] Wielokrotne dziedziczenie z jawnym
 wywołaniem konstruktorów klas bazowych z parametrami
Date: Wed, 15 Dec 2010 09:33:11 +0100
Organization: Pro Futuro
Lines: 126
Message-ID: <ie9uh2$qfj$1@opal.futuro.pl>
Reply-To: guess@who.com.pl
NNTP-Posting-Host: ns.elkomtech.com.pl
Mime-Version: 1.0
X-Trace: opal.futuro.pl 1292402019 27123 62.233.147.142 (15 Dec 2010 08:33:39 GMT)
X-Complaints-To: usenet@futuro.pl
NNTP-Posting-Date: Wed, 15 Dec 2010 08:33:39 +0000 (UTC)
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit