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
Author: Jarosław Lubczyński
Date: Wed, 15 Dec 2010 08:33
Date: Wed, 15 Dec 2010 08:33
125 lines
3563 bytes
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
Author: Szymon Sokół
Date: Wed, 15 Dec 2010 20:49
Date: Wed, 15 Dec 2010 20:49
18 lines
2004 bytes
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
Author: Michal Jankowski
Date: Thu, 16 Dec 2010 13:03
Date: Thu, 16 Dec 2010 13:03
43 lines
1961 bytes
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
Author: Jarosław Lubczyński
Date: Thu, 16 Dec 2010 17:35
Date: Thu, 16 Dec 2010 17:35
25 lines
1892 bytes
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
Author: Jarosław Lubczyński
Date: Thu, 16 Dec 2010 17:36
Date: Thu, 16 Dec 2010 17:36
63 lines
2593 bytes
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
Author: Michal Jankowski
Date: Thu, 16 Dec 2010 22:57
Date: Thu, 16 Dec 2010 22:57
12 lines
1351 bytes
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
Author: Jarosław Lubczyński
Date: Mon, 27 Dec 2010 19:04
Date: Mon, 27 Dec 2010 19:04
30 lines
2259 bytes
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
Author: Michal Jankowski
Date: Mon, 27 Dec 2010 20:44
Date: Mon, 27 Dec 2010 20:44
12 lines
1565 bytes
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
Author: Jarosław Lubczyński
Date: Tue, 28 Dec 2010 11:00
Date: Tue, 28 Dec 2010 11:00
28 lines
2271 bytes
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
Author: Ireneusz Pluta
Date: Mon, 03 Jan 2011 15:59
Date: Mon, 03 Jan 2011 15:59
9 lines
2130 bytes
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
Author: Jarosław Lubczyński
Date: Tue, 04 Jan 2011 12:57
Date: Tue, 04 Jan 2011 12:57
27 lines
2709 bytes
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
Author: Ireneusz Pluta
Date: Tue, 04 Jan 2011 16:27
Date: Tue, 04 Jan 2011 16:27
6 lines
1907 bytes
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
Author: Jarosław Lubczyński
Date: Tue, 04 Jan 2011 22:34
Date: Tue, 04 Jan 2011 22:34
24 lines
2467 bytes
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
Author: Ireneusz Pluta
Date: Wed, 05 Jan 2011 11:46
Date: Wed, 05 Jan 2011 11:46
40 lines
3246 bytes
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
Author: Jarosław Lubczyński
Date: Wed, 05 Jan 2011 13:25
Date: Wed, 05 Jan 2011 13:25
52 lines
3421 bytes
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
Author: Jarosław Lubczyński
Date: Wed, 05 Jan 2011 21:12
Date: Wed, 05 Jan 2011 21:12
149 lines
6143 bytes
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
Author: Ireneusz Pluta
Date: Thu, 06 Jan 2011 11:20
Date: Thu, 06 Jan 2011 11:20
81 lines
4048 bytes
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
Author: Jarosław Lubczyński
Date: Thu, 06 Jan 2011 14:32
Date: Thu, 06 Jan 2011 14:32
146 lines
5523 bytes
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
Author: Bartosz Jakubski
Date: Thu, 06 Jan 2011 16:34
Date: Thu, 06 Jan 2011 16:34
56 lines
3508 bytes
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
Author: Jarosław Lubczyński
Date: Thu, 06 Jan 2011 19:12
Date: Thu, 06 Jan 2011 19:12
92 lines
5061 bytes
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
Author: Michal Jankowski
Date: Thu, 06 Jan 2011 19:23
Date: Thu, 06 Jan 2011 19:23
13 lines
2208 bytes
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
Author: Jarosław Lubczyński
Date: Thu, 06 Jan 2011 20:49
Date: Thu, 06 Jan 2011 20:49
27 lines
2793 bytes
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