🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.perl
22 messages
22 total messages Started by Jarosław Lubczyński Wed, 15 Dec 2010 08:33
[OO] Wielokrotne dziedziczenie z jawnym wywołaniem konstruktorów klas bazowych z parametrami
#52113
Author: 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
Re: [OO] Wielokrotne dziedziczenie z jawnym wywołaniem konstruktorów klas bazowych z parametrami
#52114
Author: Szymon Sokół
Date: Wed, 15 Dec 2010 20:49
18 lines
2004 bytes
On Wed, 15 Dec 2010 09:33:11 +0100, Jarosław Lubczyński wrote:

> 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?

http://www.justskins.com/forums/multiple-inheritance-16373.html
http://perl.active-venture.com/pod/perltoot-inheritance.html
http://docstore.mik.ua/orelly/perl3/prog/ch12_05.htm

-- 
Szymon Sokół (SS316-RIPE) -- Network Manager                                 B
Computer Center, AGH - University of Science and Technology, Cracow, Poland  O
http://home.agh.edu.pl/szymon/ PGP key id: RSA: 0x2ABE016B, DSS: 0xF9289982  F
Free speech includes the right not to listen, if not interested -- Heinlein  H
Re: [OO] Wielokrotne dziedziczenie z jawnym wywołaniem konstruktorów klas bazowych z parametrami
#52116
Author: Michal Jankowski
Date: Thu, 16 Dec 2010 13:03
43 lines
1961 bytes
A może tak? 8-)

-=-=-=-=-=-=-=

package My::ClassA; {
     use Object::InsideOut;

     my @data :Field :Std_All(costam);
     my @para :Field :Std_All(para);
 }

package My::ClassB; {
     use Object::InsideOut;

     my @data :Field :Std_All(costam);
     my @parb :Field :Std_All(parb);
 }

 package My::ClassC; {
     use Object::InsideOut qw(My::ClassA My::ClassB);
     my @info :Field :Std_All(info);
 }

 package main;

 $obj = My::ClassC->new(
    'info' => 'help', 
    'My::ClassA'  => {'costam' => 11},
    'My::ClassB'  => {'costam' => 33},
     'para' => 4342,
     'parb' => 'ma kota',
    );

 print $obj->My::ClassA::get_costam(), "\n";
 print $obj->My::ClassB::get_costam(), "\n";                  
 print $obj->get_para(), "\n";                  
 print $obj->get_parb(), "\n";                  
 print $obj->get_info(), "\n";                  
-=-=-=-=-=-=-=

Wesołego

  MJ
Re: [OO] Wielokrotne dziedziczenie z jawnym wywołaniem konstruktorów klas bazowych z parametrami
#52115
Author: Jarosław Lubczyński
Date: Thu, 16 Dec 2010 17:35
25 lines
1892 bytes
W dniu 2010-12-15 21:49, Szymon Sokół pisze:
> On Wed, 15 Dec 2010 09:33:11 +0100, Jarosław Lubczyński wrote:
>
>> 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?
>
> http://www.justskins.com/forums/multiple-inheritance-16373.html
> http://perl.active-venture.com/pod/perltoot-inheritance.html
> http://docstore.mik.ua/orelly/perl3/prog/ch12_05.htm
>

Dzięki, poczytam, popatrzę :)

-- 
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
Re: [OO] Wielokrotne dziedziczenie z jawnym wywołaniem konstruktorów klas bazowych z parametrami
#52117
Author: Jarosław Lubczyński
Date: Thu, 16 Dec 2010 17:36
63 lines
2593 bytes
W dniu 2010-12-16 14:03, Michal Jankowski pisze:
> A może tak? 8-)
>
> -=-=-=-=-=-=-=
>
> package My::ClassA; {
>       use Object::InsideOut;
>
>       my @data :Field :Std_All(costam);
>       my @para :Field :Std_All(para);
>   }
>
> package My::ClassB; {
>       use Object::InsideOut;
>
>       my @data :Field :Std_All(costam);
>       my @parb :Field :Std_All(parb);
>   }
>
>   package My::ClassC; {
>       use Object::InsideOut qw(My::ClassA My::ClassB);
>       my @info :Field :Std_All(info);
>   }
>
>   package main;
>
>   $obj = My::ClassC->new(
>      'info' =>  'help',
>      'My::ClassA'  =>  {'costam' =>  11},
>      'My::ClassB'  =>  {'costam' =>  33},
>       'para' =>  4342,
>       'parb' =>  'ma kota',
>      );
>
>   print $obj->My::ClassA::get_costam(), "\n";
>   print $obj->My::ClassB::get_costam(), "\n";
>   print $obj->get_para(), "\n";
>   print $obj->get_parb(), "\n";
>   print $obj->get_info(), "\n";
> -=-=-=-=-=-=-=
>
> Wesołego
>
>    MJ

Dżizas!
Jedenaste: Nie używaj kodu, którego nie rozumiesz ;-)
(to o mnie ofkosz).

Dzięki, pakiet instaluję ale o atrybutach muszę się jeszcze nieco 
douczyć... :). Mało znam Perla, za mało...

PS. Zainstalowałem Object::InsideOut, kod działa w use strict po drobnej 
poprawce, mam co analizować przez łyk-end, dzięki :)

-- 
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
Re: [OO] Wielokrotne dziedziczenie z jawnym wywołaniem konstruktorów klas bazowych z parametrami
#52118
Author: Michal Jankowski
Date: Thu, 16 Dec 2010 22:57
12 lines
1351 bytes
Jarosław Lubczyński <guess@who.com.pl> writes:

> PS. Zainstalowałem Object::InsideOut, kod działa w use strict po
> drobnej poprawce, mam co analizować przez łyk-end, dzięki :)

Hehe. Obiekty InsideOut są bardzo fajne, ale żeby nie było na mnie -
ja nic poważnego w tym nie programowałem. Tyle, że wiem, że jest i jak
wygląda.

A w perlu wszystko można na 100 sposobów.

  MJ
Re: [OO] Wielokrotne dziedziczenie z jawnym wywołaniem konstruktorów klas bazowych z parametrami
#52119
Author: Jarosław Lubczyński
Date: Mon, 27 Dec 2010 19:04
30 lines
2259 bytes
W dniu 2010-12-16 23:57, Michal Jankowski pisze:
> Jarosław Lubczyński<guess@who.com.pl>  writes:
>
>> PS. Zainstalowałem Object::InsideOut, kod działa w use strict po
>> drobnej poprawce, mam co analizować przez łyk-end, dzięki :)
>
> Hehe. Obiekty InsideOut są bardzo fajne, ale żeby nie było na mnie -
> ja nic poważnego w tym nie programowałem. Tyle, że wiem, że jest i jak
> wygląda.
>
> A w perlu wszystko można na 100 sposobów.
>

Zauważyłem :).
Dwunaste: Poznaj kod który chcesz użyć :).
Wygląda, że technika obiektów odwróconych jest dokładnie tym, co 
potrzebuję. Natomiast sam pakiet Object::InsideOut wydaje się być 
faktycznie potężny chociaż być może jest nieco przyciężkawy (100kB 
żywego .pm'a budzi respekt ale i niejakie obawy). Spróbuję na początek 
podłubać trochę kodu 'na piechotę' (bez użycia pakietu, zresztą już 
zacząłem), potem 'się zobaczy'. Dzięki jeszcze raz :).

-- 
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
Re: [OO] Wielokrotne dziedziczenie z jawnym wywołaniem konstruktorów klas bazowych z parametrami
#52120
Author: Michal Jankowski
Date: Mon, 27 Dec 2010 20:44
12 lines
1565 bytes
Jarosław Lubczyński <guess@who.com.pl> writes:

> Wygląda, że technika obiektów odwróconych jest dokładnie tym, co
> potrzebuję. Natomiast sam pakiet Object::InsideOut wydaje się być
> faktycznie potężny chociaż być może jest nieco przyciężkawy (100kB
> żywego .pm'a budzi respekt ale i niejakie obawy).

Hehe. Są też inne pakiety, np. Class::InsideOut albo
Hash::Util::FieldHash. Ale nie wiem, czy do twoich zastosowań się
nadadzą.

  MJ
Re: [OO] Wielokrotne dziedziczenie z jawnym wywołaniem konstruktorów klas bazowych z parametrami
#52121
Author: Jarosław Lubczyński
Date: Tue, 28 Dec 2010 11:00
28 lines
2271 bytes
W dniu 2010-12-27 21:44, Michal Jankowski pisze:
> Jarosław Lubczyński<guess@who.com.pl>  writes:
>
>> Wygląda, że technika obiektów odwróconych jest dokładnie tym, co
>> potrzebuję. Natomiast sam pakiet Object::InsideOut wydaje się być
>> faktycznie potężny chociaż być może jest nieco przyciężkawy (100kB
>> żywego .pm'a budzi respekt ale i niejakie obawy).
>
> Hehe. Są też inne pakiety, np. Class::InsideOut albo
> Hash::Util::FieldHash. Ale nie wiem, czy do twoich zastosowań się
> nadadzą.
>
>    MJ

A jeszcze: w książeczce Damiana Conway'a "Perl. Najlepsze rozwiązania" 
realizacja techniki insideout opisywana jest bardzo starannie, a w 
szczególności jej automatyzacja przy użyciu pakietu Class::Std, również 
wygląda bardzo zachęcająco i pewno zanim w końcu na jakieś rozwiązanie 
się zdecyduję będę musiał trochę jeszcze potrenować :)

-- 
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
Re: Wielokrotne dziedziczenie z jawnym wywołaniem konstruktorów klas bazowych z parametrami
#52122
Author: Ireneusz Pluta
Date: Mon, 03 Jan 2011 15:59
9 lines
2130 bytes
On 28 Gru 2010, 12:00, Jarosław Lubczyński <gu...@who.com.pl> wrote:
> A jeszcze: w książeczce Damiana Conway'a "Perl. Najlepsze rozwiązania"
> realizacja techniki insideout opisywana jest bardzo starannie, a w
> szczególności jej automatyzacja przy użyciu pakietu Class::Std, również
> wygląda bardzo zachęcająco i pewno zanim w końcu na jakieś rozwiązanie
> się zdecyduję będę musiał trochę jeszcze potrenować :)

... Class::Std chyba sobie daruj, sam autor już go nie rekomenduje ->
https://www.socialtext.net/perl5/index.cgi?pbp_module_recommendation_commentary
Re: Wielokrotne dziedziczenie z jawnym wywołaniem konstruktorów klas bazowych z parametrami
#52123
Author: Jarosław Lubczyński
Date: Tue, 04 Jan 2011 12:57
27 lines
2709 bytes
W dniu 2011-01-03 16:59, Ireneusz Pluta pisze:
> On 28 Gru 2010, 12:00, Jarosław Lubczyński<gu...@who.com.pl>  wrote:
>> A jeszcze: w książeczce Damiana Conway'a "Perl. Najlepsze rozwiązania"
>> realizacja techniki insideout opisywana jest bardzo starannie, a w
>> szczególności jej automatyzacja przy użyciu pakietu Class::Std, również
>> wygląda bardzo zachęcająco i pewno zanim w końcu na jakieś rozwiązanie
>> się zdecyduję będę musiał trochę jeszcze potrenować :)
>
> ... Class::Std chyba sobie daruj, sam autor już go nie rekomenduje ->
> https://www.socialtext.net/perl5/index.cgi?pbp_module_recommendation_commentary

Shiffft, a właśnie ten pakiet miałem ogłosić zwycięzcą końkursu bo 
najbardziej podchodził mi pod palce :). Szkoda, że w podanym linku nie 
piszą *dlaczego* Class::Std nie jest już polecany (i póki co nie 
znalazłem takiego uzasadnienia, jedynie informację, że Class::Std nie 
jest thread-safe). Dodatkowo na wlinkowanej przez Ciebie stronie 
wspomniano Moose, o którym wcześniej czytałem, że jest pakietem 
znakomitym, chociaż nieco ciężkim. No i znowu jestem w kropce ;).

-- 
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
Re: Wielokrotne dziedziczenie z jawnym wywołaniem konstruktorów klas bazowych z parametrami
#52124
Author: Ireneusz Pluta
Date: Tue, 04 Jan 2011 16:27
6 lines
1907 bytes
On 4 Sty, 13:57, Jarosław Lubczyński <gu...@who.com.pl> wrote:
> Dodatkowo na wlinkowanej przez Ciebie stronie
> wspomniano Moose, o którym wcześniej czytałem, że jest pakietem
> znakomitym, chociaż nieco ciężkim.
maszyna może nie mieć lekko, ale Ty dostaniesz skrzydeł. Spróbuj sam i
oceń.
Re: Wielokrotne dziedziczenie z jawnym wywołaniem konstruktorów klas bazowych z parametrami
#52125
Author: Jarosław Lubczyński
Date: Tue, 04 Jan 2011 22:34
24 lines
2467 bytes
W dniu 2011-01-04 17:27, Ireneusz Pluta pisze:
> On 4 Sty, 13:57, Jarosław Lubczyński<gu...@who.com.pl>  wrote:
>> Dodatkowo na wlinkowanej przez Ciebie stronie
>> wspomniano Moose, o którym wcześniej czytałem, że jest pakietem
>> znakomitym, chociaż nieco ciężkim.
> maszyna może nie mieć lekko, ale Ty dostaniesz skrzydeł. Spróbuj sam i
> oceń.

Oceniłem. A właściwie Benchmark ocenił :). Z trzech testowanych przeze 
mnie pakietów implementujących InsideOut Objects (Moose, Class::Std, 
Object::InsideOut) Moose zachowuje się znakomicie jeżeli chodzi od 
szybkość akcesorów (nawet z kontrolą typów nie jest źle), natomiast 
zdecydowanie szybciej od pozostałych konstruuje obiekty. Co chyba 
przesądza sprawę. Zwłaszcza, że składnia Moose'a jest naprawdę bardzo, 
bardzo :). Aha, nie testowałem jeszcze wielokrotnego dziedziczenia.

-- 
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
Re: Wielokrotne dziedziczenie z jawnym wywołaniem konstruktorów klas bazowych z parametrami
#52126
Author: Ireneusz Pluta
Date: Wed, 05 Jan 2011 11:46
40 lines
3246 bytes
On 4 Sty, 23:34, Jarosław Lubczyński <gu...@who.com.pl> wrote:
> W dniu 2011-01-04 17:27, Ireneusz Pluta pisze:
>
> > On 4 Sty, 13:57, Jaros aw Lubczy ski<gu...@who.com.pl>  wrote:
> >> Dodatkowo na wlinkowanej przez Ciebie stronie
> >> wspomniano Moose, o kt rym wcze niej czyta em, e jest pakietem
> >> znakomitym, chocia nieco ci kim.
> > maszyna mo e nie mie lekko, ale Ty dostaniesz skrzyde . Spr buj sam i
> > oce .
>
> Oceni em. A w a ciwie Benchmark oceni :). Z trzech testowanych przeze
> mnie pakiet w implementuj cych InsideOut Objects (Moose, Class::Std,
> Object::InsideOut)

Moose nie jest inside out, tylko blesowanym haszem:

#v+
perl -MMoose -MData::Dumper -le 'package Foo; use Moose; use
Data::Dumper; has raz => (is => "rw"); my $o = __PACKAGE__->new( raz
=> "dwa"); print Dumper [ $o->raz, $o->{raz}, $o ];'
$VAR1 = [
          'dwa',
          'dwa',
          bless( {
                   'raz' => 'dwa'
                 }, 'Foo' )
        ];
#v-

Ale jeżeli zależy Ci na insajdautowości, możesz użyć
MooseX::InsideOut.

> Moose zachowuje si znakomicie je eli chodzi od
> szybko akcesor w (nawet z kontrol typ w nie jest le), natomiast
> zdecydowanie szybciej od pozosta ych konstruuje obiekty. Co chyba
> przes dza spraw . Zw aszcza, e sk adnia Moose'a jest naprawd bardzo,
> bardzo :). Aha, nie testowa em jeszcze wielokrotnego dziedziczenia.

Skoro już tak systematycznie zabierasz się za temat, to może dołącz do
testów jeszcze Mouse? -> http://search.cpan.org/~gfuji/Mouse-0.88/lib/Mouse.pm
Re: Wielokrotne dziedziczenie z jawnym wywołaniem konstruktorów klas bazowych z parametrami
#52127
Author: Jarosław Lubczyński
Date: Wed, 05 Jan 2011 13:25
52 lines
3421 bytes
W dniu 2011-01-05 12:46, Ireneusz Pluta pisze:
> On 4 Sty, 23:34, Jarosław Lubczyński<gu...@who.com.pl>  wrote:
>> W dniu 2011-01-04 17:27, Ireneusz Pluta pisze:
>>
>>> On 4 Sty, 13:57, Jaros aw Lubczy ski<gu...@who.com.pl>    wrote:
>>>> Dodatkowo na wlinkowanej przez Ciebie stronie
>>>> wspomniano Moose, o kt rym wcze niej czyta em, e jest pakietem
>>>> znakomitym, chocia nieco ci kim.
>>> maszyna mo e nie mie lekko, ale Ty dostaniesz skrzyde . Spr buj sam i
>>> oce .
>>
>> Oceni em. A w a ciwie Benchmark oceni :). Z trzech testowanych przeze
>> mnie pakiet w implementuj cych InsideOut Objects (Moose, Class::Std,
>> Object::InsideOut)
>
> Moose nie jest inside out, tylko blesowanym haszem:
>
> #v+
> perl -MMoose -MData::Dumper -le 'package Foo; use Moose; use
> Data::Dumper; has raz =>  (is =>  "rw"); my $o = __PACKAGE__->new( raz
> =>  "dwa"); print Dumper [ $o->raz, $o->{raz}, $o ];'
> $VAR1 = [
>            'dwa',
>            'dwa',
>            bless( {
>                     'raz' =>  'dwa'
>                   }, 'Foo' )
>          ];
> #v-
>
> Ale jeżeli zależy Ci na insajdautowości, możesz użyć
> MooseX::InsideOut.
>
>> Moose zachowuje si znakomicie je eli chodzi od
>> szybko akcesor w (nawet z kontrol typ w nie jest le), natomiast
>> zdecydowanie szybciej od pozosta ych konstruuje obiekty. Co chyba
>> przes dza spraw . Zw aszcza, e sk adnia Moose'a jest naprawd bardzo,
>> bardzo :). Aha, nie testowa em jeszcze wielokrotnego dziedziczenia.
>
> Skoro już tak systematycznie zabierasz się za temat, to może dołącz do
> testów jeszcze Mouse? ->  http://search.cpan.org/~gfuji/Mouse-0.88/lib/Mouse.pm

Już dołączyłem dziś raniutko :).

-- 
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
Re: Wielokrotne dziedziczenie z jawnym wywołaniem konstruktorów klas bazowych z parametrami
#52128
Author: Jarosław Lubczyński
Date: Wed, 05 Jan 2011 21:12
149 lines
6143 bytes
W dniu 2011-01-05 12:46, Ireneusz Pluta pisze:
> On 4 Sty, 23:34, Jarosław Lubczyński<gu...@who.com.pl>  wrote:
>> W dniu 2011-01-04 17:27, Ireneusz Pluta pisze:
>>
>>> On 4 Sty, 13:57, Jaros aw Lubczy ski<gu...@who.com.pl>    wrote:
>>>> Dodatkowo na wlinkowanej przez Ciebie stronie
>>>> wspomniano Moose, o kt rym wcze niej czyta em, e jest pakietem
>>>> znakomitym, chocia nieco ci kim.
>>> maszyna mo e nie mie lekko, ale Ty dostaniesz skrzyde . Spr buj sam i
>>> oce .
>>
>> Oceni em. A w a ciwie Benchmark oceni :). Z trzech testowanych przeze
>> mnie pakiet w implementuj cych InsideOut Objects (Moose, Class::Std,
>> Object::InsideOut)
>
> Moose nie jest inside out, tylko blesowanym haszem:
>
> #v+
> perl -MMoose -MData::Dumper -le 'package Foo; use Moose; use
> Data::Dumper; has raz =>  (is =>  "rw"); my $o = __PACKAGE__->new( raz
> =>  "dwa"); print Dumper [ $o->raz, $o->{raz}, $o ];'
> $VAR1 = [
>            'dwa',
>            'dwa',
>            bless( {
>                     'raz' =>  'dwa'
>                   }, 'Foo' )
>          ];
> #v-

Dzięki, faktycznie nie sprawdziłem tego.

>
> Ale jeżeli zależy Ci na insajdautowości, możesz użyć
> MooseX::InsideOut.

Spodobała mi się ta technika, nie powiem :). Moose / Mouse też. Ale 
przykładu podanego przez kol. Michała Jankowskiego nie daje się 
bezpośrednio zaadaptować:

package My::ClassA;
{
     use Moose;

     has data => (is => 'rw', isa => 'Int', required => '1');
     has para => (is => 'rw', isa => 'Int', required => '1');

     no Moose;
}

package My::ClassB;
{
     use Moose;

     has data => (is => 'rw', isa => 'Int', required => '1');
     has parb => (is => 'rw', isa => 'Str', required => '1');

     no Moose;
}

package My::ClassC;
{
     use Moose;
     extends qw( My::ClassA My::ClassB);

     has info => (is => 'rw', isa => 'Str', required => '1');

     no Moose;
}

package main;

$obj = My::ClassC->new # BŁĄD!
(
     {
         'info' => 'help',
         'My::ClassA' => { data => 11},
         'My::ClassB' => { data => 31},
         'para' => 4342,
         'parb' => 'ma kota',
     }
);

print $obj->My::ClassA::data(), "\n";
print $obj->My::ClassB::data(), "\n";
print $obj->para(), "\n";
print $obj->parb(), "\n";
print $obj->info(), "\n";

__END__

Przy wywołaniu My::ClassC->new dostaję błąd:

Attribute (data) is required at
/usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/Class/MOP/Class.pm line 
603
Class::MOP::Class::_construct_instance('Moose::Meta::Class=HASH(0x9a2347c)',
'HASH(0x9a324ec)') called at
/usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/Class/MOP/Class.pm line 
576
....

Zamiana use Moose na use MooseX::InsideOut nic nie daje.
Gdzie jest błąd? Jak powinno wyglądać wywołanie? Znowu jakoś nie mogę 
znaleźć rozwiązania w Sieci...


>
>> Moose zachowuje si znakomicie je eli chodzi od
>> szybko akcesor w (nawet z kontrol typ w nie jest le), natomiast
>> zdecydowanie szybciej od pozosta ych konstruuje obiekty. Co chyba
>> przes dza spraw . Zw aszcza, e sk adnia Moose'a jest naprawd bardzo,
>> bardzo :). Aha, nie testowa em jeszcze wielokrotnego dziedziczenia.
>
> Skoro już tak systematycznie zabierasz się za temat, to może dołącz do
> testów jeszcze Mouse? ->  http://search.cpan.org/~gfuji/Mouse-0.88/lib/Mouse.pm


Jak napisałem, testy Mouse'a już wcześniej zdążyłem przeprowadzić, 
wypadły rewelacyjnie, teraz dołączyłem MooseX::InsideOut. Najlepiej 
wychodzi Mouse, najgorzej MooseX::InsideOut oraz Object::InsideOut i 
Class::Std. Wygląda, że hermetyzacja przez obiekty odwrócone jest 
baardzo kosztowna. Ale dlaczego? Niespecjalnie mogę zrozumieć. 
Konstrukcja jest przecież tyleż efektowna co prosta.

Mouse z kontrolą typów jest w teście mieszanym ( konstruktor + 
destruktor + 10x wywołanie obu akcesorów dla pola) jest niemal 20x 
(dwadzieścia razy) szybszy od MooseX::InsideOut. Masakra... Spróbuję 
jeszcze jednego rozwiązania zanim podejmę ostateczną decyzję, który 
pakiet wybrać.

Przy okazji. Użycie Mouse generuje ostrzeżenie:

Prototype mismatch: sub Mouse::Util::get_linear_isa ($;$) vs none at 
/usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/Mouse/Util.pm 
line 178.

W Sieci nie znalazłem niczego co pozwoliłoby pozbyć się tego komunikatu. 
Co mogę z tym zrobić?


-- 
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
Re: Wielokrotne dziedziczenie z jawnym wywołaniem konstruktorów klas bazowych z parametrami
#52129
Author: Ireneusz Pluta
Date: Thu, 06 Jan 2011 11:20
81 lines
4048 bytes
On 5 Sty, 22:12, Jarosław Lubczyński <gu...@who.com.pl> wrote:
>
> Spodoba a mi si ta technika, nie powiem :). Moose / Mouse te . Ale
> przyk adu podanego przez kol. Micha a Jankowskiego nie daje si
> bezpo rednio zaadaptowa :
>
> package My::ClassA;
> {
>      use Moose;
>
>      has data => (is => 'rw', isa => 'Int', required => '1');
>      has para => (is => 'rw', isa => 'Int', required => '1');
>
>      no Moose;
>
> }
>
> package My::ClassB;
> {
>      use Moose;
>
>      has data => (is => 'rw', isa => 'Int', required => '1');
>      has parb => (is => 'rw', isa => 'Str', required => '1');
>
>      no Moose;
>
> }
>
> package My::ClassC;
> {
>      use Moose;
>      extends qw( My::ClassA My::ClassB);
>
>      has info => (is => 'rw', isa => 'Str', required => '1');
>
>      no Moose;
>
> }
>
> package main;
>
> $obj = My::ClassC->new # B D!
> (
>      {
>          'info' => 'help',
>          'My::ClassA' => { data => 11},
>          'My::ClassB' => { data => 31},
>          'para' => 4342,
>          'parb' => 'ma kota',
>      }
> );
>
> print $obj->My::ClassA::data(), "\n";
> print $obj->My::ClassB::data(), "\n";
> print $obj->para(), "\n";
> print $obj->parb(), "\n";
> print $obj->info(), "\n";
>
> __END__
>
> Przy wywo aniu My::ClassC->new dostaj b d:
>
> Attribute (data) is required at
> /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/Class/MOP/Class.pm line
> 603
> Class::MOP::Class::_construct_instance('Moose::Meta::Class=HASH(0x9a2347c)',
> 'HASH(0x9a324ec)') called at
> /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/Class/MOP/Class.pm line
> 576

Ten komunikat to wyjaśnia. Atrybut 'data' zadeklarowałeś jako required
w klasach pierwotnych, a nie umieściłeś go w konstrukcji. Dodaj go w
My::ClassC->new().

A potem spróbuj w My::ClassA dodać jeszcze "use
MooseX::StrictConstructor" i zobaczysz dlaczego pierwotnego przykładu
nie należało przepisywać zbyt dosłownie - ale prościej - bo to
Moose :-).

Na wiele pytań można też szybko znaleźć odpowiedzi przy pomocy
Data::Dumper, a jeszcze szybciej przy pomocy perl -d.
Re: Wielokrotne dziedziczenie z jawnym wywołaniem konstruktorów klas bazowych z parametrami
#52130
Author: Jarosław Lubczyński
Date: Thu, 06 Jan 2011 14:32
146 lines
5523 bytes
W dniu 2011-01-06 12:20, Ireneusz Pluta pisze:
> On 5 Sty, 22:12, Jarosław Lubczyński<gu...@who.com.pl>  wrote:
>>
>> Spodoba a mi si ta technika, nie powiem :). Moose / Mouse te . Ale
>> przyk adu podanego przez kol. Micha a Jankowskiego nie daje si
>> bezpo rednio zaadaptowa :
>>
>> package My::ClassA;
>> {
>>       use Moose;
>>
>>       has data =>  (is =>  'rw', isa =>  'Int', required =>  '1');
>>       has para =>  (is =>  'rw', isa =>  'Int', required =>  '1');
>>
>>       no Moose;
>>
>> }
>>
>> package My::ClassB;
>> {
>>       use Moose;
>>
>>       has data =>  (is =>  'rw', isa =>  'Int', required =>  '1');
>>       has parb =>  (is =>  'rw', isa =>  'Str', required =>  '1');
>>
>>       no Moose;
>>
>> }
>>
>> package My::ClassC;
>> {
>>       use Moose;
>>       extends qw( My::ClassA My::ClassB);
>>
>>       has info =>  (is =>  'rw', isa =>  'Str', required =>  '1');
>>
>>       no Moose;
>>
>> }
>>
>> package main;
>>
>> $obj = My::ClassC->new # B D!
>> (
>>       {
>>           'info' =>  'help',
>>           'My::ClassA' =>  { data =>  11},
>>           'My::ClassB' =>  { data =>  31},
>>           'para' =>  4342,
>>           'parb' =>  'ma kota',
>>       }
>> );
>>
>> print $obj->My::ClassA::data(), "\n";
>> print $obj->My::ClassB::data(), "\n";
>> print $obj->para(), "\n";
>> print $obj->parb(), "\n";
>> print $obj->info(), "\n";
>>
>> __END__
>>
>> Przy wywo aniu My::ClassC->new dostaj b d:
>>
>> Attribute (data) is required at
>> /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/Class/MOP/Class.pm line
>> 603
>> Class::MOP::Class::_construct_instance('Moose::Meta::Class=HASH(0x9a2347c)',
>> 'HASH(0x9a324ec)') called at
>> /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/Class/MOP/Class.pm line
>> 576
>
> Ten komunikat to wyjaśnia. Atrybut 'data' zadeklarowałeś jako required
> w klasach pierwotnych, a nie umieściłeś go w konstrukcji. Dodaj go w
> My::ClassC->new().

Ale nie mam innego pomysłu, jak go dodać. Atrybut 'data' jest w *obu* 
klasach bazowych, więc należy go sprefixować nazwą klasy, co, jak mi się 
wydawało, próbowałem zrobić. Wywołanie:

$obj = My::ClassC->new	# (*)
(
         'info' => 'help',
         'data' => 11,
         'para' => 4342,
         'parb' => 'ma kota',
);

oczywiście ustawia wartość  (tu: 11) w *obu* klasach bazowych, a nie o 
to przecież chodzi...

Aha, próba wywołania typu:

$obj = My::ClassC->new
(
         'info' => 'help',
         'My::ClassA::data' => 11,
         'My::ClassB::data' => 31,
         'para' => 4342,
         'parb' => 'ma kota',
);

też nie prowadzi do sukcesu. No i pomysły mi się skończyły...

>
> A potem spróbuj w My::ClassA dodać jeszcze "use
> MooseX::StrictConstructor" i zobaczysz dlaczego pierwotnego przykładu
> nie należało przepisywać zbyt dosłownie - ale prościej - bo to
> Moose :-).
>
> Na wiele pytań można też szybko znaleźć odpowiedzi przy pomocy
> Data::Dumper, a jeszcze szybciej przy pomocy perl -d.

Dump obiektu po wywołaniu (*) jest taki:

$VAR1 = bless( {}, 'My::ClassC' );
Mamy pustego (rozumiem, że 'zahermetyzowanego' hasza pobłogosławionego 
nazwą klasy. I nie wiem co dalej...

Aha: próba wywołania akcesorów

$obj->My::ClassA::data( 5);
$obj->My::ClassB::data( 7);

też nie kończy się sukcesem. Print jak Cyganka prawdę powie:

print "ClassA::Data=", $obj->My::ClassA::data, "\n";
print "ClassB::Data=", $obj->My::ClassB::data, "\n";

W wyniku dostałem:

ClassA::Data=7
ClassB::Data=7

też źle...

No i chhwilowo pomysły mi się skończyły... Może wieczorkiem poszperam w 
Sieci.

-- 
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
Re: Wielokrotne dziedziczenie z jawnym wywołaniem konstruktorów klas bazowych z parametrami
#52131
Author: Bartosz Jakubski
Date: Thu, 06 Jan 2011 16:34
56 lines
3508 bytes
On 2011-01-06, Jarosław Lubczyński <guess@who.com.pl> wrote:
> W dniu 2011-01-06 12:20, Ireneusz Pluta pisze:
>>
>> Ten komunikat to wyjaśnia. Atrybut 'data' zadeklarowałeś jako required
>> w klasach pierwotnych, a nie umieściłeś go w konstrukcji. Dodaj go w
>> My::ClassC->new().
>
> Ale nie mam innego pomysłu, jak go dodać. Atrybut 'data' jest w *obu* 
> klasach bazowych, więc należy go sprefixować nazwą klasy, co, jak mi się 
> wydawało, próbowałem zrobić. Wywołanie:

Skąd ten pomysł z prefiksowaniem? ZTCW nie możesz mieć dwóch atrybutów
o tej samej nazwie i tyle. Jaką struturę próbujesz modelować? Bo trochę
dziwnie wygląda ten przykład. Nie bardziej naturalna byłaby
jakaś delegacja np.?

>
> $obj = My::ClassC->new	# (*)
> (
>          'info' => 'help',
>          'data' => 11,
>          'para' => 4342,
>          'parb' => 'ma kota',
> );
>
> oczywiście ustawia wartość  (tu: 11) w *obu* klasach bazowych, a nie o 
> to przecież chodzi...

Nie w obu klasach bazowych, tylko w obiekcie. On ma jeden atrybut (jeśli
dziedziczysz z wielu, to "użył się" z pierwszej bazowej.
>
> Aha, próba wywołania typu:
>
> $obj = My::ClassC->new
> (
>          'info' => 'help',
>          'My::ClassA::data' => 11,
>          'My::ClassB::data' => 31,
>          'para' => 4342,
>          'parb' => 'ma kota',
> );
>
> też nie prowadzi do sukcesu. No i pomysły mi się skończyły...

Chyba próbujesz zastosować w Moosie jakąś dziwną konwencję z jakiegoś
innego modułu. Proponuję na spokojnie przeczytać sobię dokumentację
Moose - jest naprawdę sympatyczna: Moose::Manual(::*) i Moose::Cookbook(::*)

Z pewnością _jakoś_ da się osiągnąć to co chcesz w Moose (przez ->meta
i Class::MOP naprawdę wiele da się zmienić), ale trudno oprzec się
wrażeniu, że na siłę jakiś problem wpasowałeś w wielokrotne
dziedziczenie i teraz próbujesz się wykopać :-)


-- 
Bartosz Jakubski
Re: Wielokrotne dziedziczenie z jawnym wywołaniem konstruktorów klas bazowych z parametrami
#52132
Author: Jarosław Lubczyński
Date: Thu, 06 Jan 2011 19:12
92 lines
5061 bytes
W dniu 2011-01-06 17:34, Bartosz Jakubski pisze:
> On 2011-01-06, Jarosław Lubczyński<guess@who.com.pl>  wrote:
>> W dniu 2011-01-06 12:20, Ireneusz Pluta pisze:
>>>
>>> Ten komunikat to wyjaśnia. Atrybut 'data' zadeklarowałeś jako required
>>> w klasach pierwotnych, a nie umieściłeś go w konstrukcji. Dodaj go w
>>> My::ClassC->new().
>>
>> Ale nie mam innego pomysłu, jak go dodać. Atrybut 'data' jest w *obu*
>> klasach bazowych, więc należy go sprefixować nazwą klasy, co, jak mi się
>> wydawało, próbowałem zrobić. Wywołanie:
>
> Skąd ten pomysł z prefiksowaniem? ZTCW nie możesz mieć dwóch atrybutów
> o tej samej nazwie i tyle.

W zwykłym dziedziczeniu przez błogosławienie hasza owszem, dlatego 
zainteresowałem się techniką obiektów odwróconych, gdzie takie sztuczki 
są możliwe :)

>  Jaką struturę próbujesz modelować? Bo trochę
> dziwnie wygląda ten przykład. Nie bardziej naturalna byłaby
> jakaś delegacja np.?
>
>>
>> $obj = My::ClassC->new	# (*)
>> (
>>           'info' =>  'help',
>>           'data' =>  11,
>>           'para' =>  4342,
>>           'parb' =>  'ma kota',
>> );
>>
>> oczywiście ustawia wartość  (tu: 11) w *obu* klasach bazowych, a nie o
>> to przecież chodzi...
>
> Nie w obu klasach bazowych, tylko w obiekcie.

Tak, 'drobny' brak precyzji z mojej strony.

> On ma jeden atrybut (jeśli
> dziedziczysz z wielu, to "użył się" z pierwszej bazowej.

OK, przyjąłem. Moose nie oferuje hermetyzacji. Będę musiał sobie z tym 
jakoś poradzić :).

>>
>> Aha, próba wywołania typu:
>>
>> $obj = My::ClassC->new
>> (
>>           'info' =>  'help',
>>           'My::ClassA::data' =>  11,
>>           'My::ClassB::data' =>  31,
>>           'para' =>  4342,
>>           'parb' =>  'ma kota',
>> );
>>
>> też nie prowadzi do sukcesu. No i pomysły mi się skończyły...
>
> Chyba próbujesz zastosować w Moosie jakąś dziwną konwencję z jakiegoś
> innego modułu. Proponuję na spokojnie przeczytać sobię dokumentację
> Moose - jest naprawdę sympatyczna: Moose::Manual(::*) i Moose::Cookbook(::*)

Tak, to dobry pomysł, oddam się lekturze i pewno trochę mi sie rozjaśni, 
zwłaszcza, że nie terminy mnie nie gonią.

>
> Z pewnością _jakoś_ da się osiągnąć to co chcesz w Moose (przez ->meta
> i Class::MOP naprawdę wiele da się zmienić), ale trudno oprzec się
> wrażeniu, że na siłę jakiś problem wpasowałeś w wielokrotne
> dziedziczenie i teraz próbujesz się wykopać :-)
>
>

Nie, to po prostu przyzwyczajenie z C++, gdzie biorę dwie klasy z półki, 
tworzę trzecią poprzez wielokrotne dziedziczenie *nie* *przejmując* 
*się* nazwami pól w klasach bazowych bo C++ oferuje pełną hermetyzację i 
mam nową klasę, której instancje mają dokładnie takie cechy jakie 
potrzebuję - praktycznie bez żadnego wysiłku. To samo (jak zdążyłem się 
naumieć) można osiągnąć w Perlu w technice InsideOut, niestety oferowane 
pakiety są dla mnie zdecydowanie za ciężkie. Dlatego ostatecznie chyba 
użyję Mouse i będę musiał się pogodzić z brakiem hermetyzacji obiektów. 
Na szczęście kodem Perla zarządzam osobiście :)

-- 
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
Re: Wielokrotne dziedziczenie z jawnym wywołaniem konstruktorów klas bazowych z parametrami
#52133
Author: Michal Jankowski
Date: Thu, 06 Jan 2011 19:23
13 lines
2208 bytes
Jarosław Lubczyński <guess@who.com.pl> writes:

> Nie, to po prostu przyzwyczajenie z C++, gdzie biorę dwie klasy z
> półki, tworzę trzecią poprzez wielokrotne dziedziczenie *nie*
> *przejmując* *się* nazwami pól w klasach bazowych bo C++ oferuje pełną
> hermetyzację i mam nową klasę, której instancje mają dokładnie takie
> cechy jakie potrzebuję - praktycznie bez żadnego wysiłku. To samo (jak
> zdążyłem się naumieć) można osiągnąć w Perlu w technice InsideOut,
> niestety oferowane pakiety są dla mnie zdecydowanie za ciężkie.

No niestety, albo rybki, albo akwarium... 

  MJ
Re: Wielokrotne dziedziczenie z jawnym wywołaniem konstruktorów klas bazowych z parametrami
#52134
Author: Jarosław Lubczyński
Date: Thu, 06 Jan 2011 20:49
27 lines
2793 bytes
W dniu 2011-01-06 20:23, Michal Jankowski pisze:
> Jarosław Lubczyński<guess@who.com.pl>  writes:
>
>> Nie, to po prostu przyzwyczajenie z C++, gdzie biorę dwie klasy z
>> półki, tworzę trzecią poprzez wielokrotne dziedziczenie *nie*
>> *przejmując* *się* nazwami pól w klasach bazowych bo C++ oferuje pełną
>> hermetyzację i mam nową klasę, której instancje mają dokładnie takie
>> cechy jakie potrzebuję - praktycznie bez żadnego wysiłku. To samo (jak
>> zdążyłem się naumieć) można osiągnąć w Perlu w technice InsideOut,
>> niestety oferowane pakiety są dla mnie zdecydowanie za ciężkie.
>
> No niestety, albo rybki, albo akwarium...
>
>    MJ

Tak bywa :). Przeżyję. Dzięki za pomoc. Użyję pakietu Mouse 
(rewelacyjnie szybki) i będę uważał coby sobie nie napsocić powtarzaniem 
nazw atrybutów. A dokumentację przeczytam ofkosz. Dzięki jeszcze raz :)

-- 
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
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads