🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: Wielokrotne dziedziczenie z jawnym wywołaniem konstruktorów klas bazowych z parametrami

#52130
From: 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
Technical Details
Message-ID: <ig4jq1$7r2$1@inews.gazeta.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail
References: <ie9uh2$qfj$1@opal.futuro.pl> <kjzr5dheupb.fsf@ccfs1.fuw.edu.pl> <iedin2$bbc$2@inews.gazeta.pl> <kjzmxo5con2.fsf@ccfs1.fuw.edu.pl> <ifanvr$iut$1@inews.gazeta.pl> <kjzipyf7xpf.fsf@ccfs1.fuw.edu.pl> <ifcg1j$a6r$1@inews.gazeta.pl> <72ddf779-ba30-44e8-bf4d-132def818429@fu15g2000vbb.googlegroups.com> <ifv5fs$4ir$1@opal.futuro.pl> <7af449a1-136b-46b1-a3bf-7fc25fc1b8cd@w18g2000vbe.googlegroups.com> <ig07a6$18l$1@inews.gazeta.pl> <8dc8aba4-2abe-42db-82b5-366ba34a9d8d@l7g2000vbv.googlegroups.com> <ig2mrl$2cl$1@inews.gazeta.pl> <77910e78-c927-43fe-b6c9-feb092225395@d7g2000vbv.googlegroups.com>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail
From: Jarosław Lubczyński <guess@who.com.pl>
Newsgroups: pl.comp.lang.perl
Subject: Re: Wielokrotne dziedziczenie z jawnym
 wywołaniem konstruktorów klas bazowych z parametrami
Date: Thu, 06 Jan 2011 15:32:02 +0100
Organization: "Portal Gazeta.pl -> http://www.gazeta.pl"
Lines: 147
Message-ID: <ig4jq1$7r2$1@inews.gazeta.pl>
References: <ie9uh2$qfj$1@opal.futuro.pl> <kjzr5dheupb.fsf@ccfs1.fuw.edu.pl> <iedin2$bbc$2@inews.gazeta.pl> <kjzmxo5con2.fsf@ccfs1.fuw.edu.pl> <ifanvr$iut$1@inews.gazeta.pl> <kjzipyf7xpf.fsf@ccfs1.fuw.edu.pl> <ifcg1j$a6r$1@inews.gazeta.pl> <72ddf779-ba30-44e8-bf4d-132def818429@fu15g2000vbb.googlegroups.com> <ifv5fs$4ir$1@opal.futuro.pl> <7af449a1-136b-46b1-a3bf-7fc25fc1b8cd@w18g2000vbe.googlegroups.com> <ig07a6$18l$1@inews.gazeta.pl> <8dc8aba4-2abe-42db-82b5-366ba34a9d8d@l7g2000vbv.googlegroups.com> <ig2mrl$2cl$1@inews.gazeta.pl> <77910e78-c927-43fe-b6c9-feb092225395@d7g2000vbv.googlegroups.com>
NNTP-Posting-Host: apn-77-115-206-138.dynamic.gprs.plus.pl
Mime-Version: 1.0
X-Trace: inews.gazeta.pl 1294324354 8034 77.115.206.138 (6 Jan 2011 14:32:34 GMT)
X-Complaints-To: usenet@agora.pl
NNTP-Posting-Date: Thu, 6 Jan 2011 14:32:34 +0000 (UTC)
X-User: eljot_007
In-Reply-To: <77910e78-c927-43fe-b6c9-feb092225395@d7g2000vbv.googlegroups.com>
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