"polymorfni" objekt

Jan Kasprzak kas na fi.muni.cz
Středa Duben 20 21:46:27 CEST 2011


	Dobry vecer,

predstavte si, ze mate objekt, ktery je dostupny ve vsech programech
nejakeho systemu (treba $r cili Apache2::RequestRec nebo $q cili CGI
ve webovych aplikacich). A ted chcete, aby ten objekt mel nejakou
sadu metod, pricemz v kazdem programu potrebujete jen nejakou omezenou
podmnozinu vsech dostupnych metod.

	Muzete vsechny metody dat do jednoho modulu a proste jen pouzivat
ty ktere potrebujete. Problem je, ze kdyz pak napisete

time perl -MMoje::CGI -e 1

tak to trva dve vteriny.

	Cili dotaz je, jakou metodou byste dosahli toho, aby na zacatku
programu misto

my $q = Moje::CGI->new();

bylo mozno rict neco jako

my $q = Moje::CGI->new(isa => [ qw(
	Moje::CGI::Autentizovane
	Moje::CGI::DBI
	Moje::CGI::Tiskarny
	...
) ]);

a vysledne $q melo pak dostupne metody z tech uvedenych modulu.
Nejlepe jeste tak, abych mohl definovat i zavislosti mezi
jednotlivymi sub-moduly - napriklad ze bych treba v Moje/CGI/Tiskarny.pm mohl
rict neco jako ze tento modul ma zaroven nacitat modul Moje::CGI::TeX,
a ve vyslednem $q by pak byly dostupne metody nejen z Moje::CGI::Tiskarny,
ale i z Moje::CGI::TeX, aniz bych to specifikoval v konstruktoru.

Resenim je asi nejak si hrat s @ISA, ale vsude se pise ze na @ISA nemam
sahat a radsi pouzivat base.pm. Taky ale tohle vyzaduje volani
"use Moje::CGI::Neco" uvnitr retezcoveho eval "" (je-li cilem aby se
nekompilovalo pokazde vsechno), coz nevim jak je rychle.

	Jak byste tohle resili?

-Y.   

-- 
| Jan "Yenya" Kasprzak  <kas at {fi.muni.cz - work | yenya.net - private}> |
| GPG: ID 1024/D3498839      Fingerprint 0D99A7FB206605D7 8B35FCDE05B18A5E |
| http://www.fi.muni.cz/~kas/    Journal: http://www.fi.muni.cz/~kas/blog/ |
Please don't top post and in particular don't attach entire digests to your
mail or we'll all soon be using bittorrent to read the list.     --Alan Cox


Další informace o konferenci Perl