Napište moduly definující třídy Obrazec, Kruh a Ctverec. Kruh a Ctverec
budou potomky třídy Obrazec. Ta bude definovat konstruktor (může fungovat
jako metoda třídy i jako metoda objektu) a metodu, která
vypíše jméno obrazce. Atributem objektu třídy Kruh bude průměr, třída
Ctverec má atributy délka strany nebo délka úhlopříčky. Obě třídy definují
metody pro výpočet obsahu obrazce. V případě, že potřebné atributy nejsou
nastaveny, vypište varování.
Použijte moduly Kruh a Ctverec pro vytvoření objektů těchto tříd, nastavte
jim atributy a vypište obsahy těchto obrazců.
Atributy objektů mohou být nastaveny hned v konstruktoru, ale mohou být také
nastaveny až po vytvoření objektu. Napište proto funkce, které umějí s
atributy pracovat (tzn. modifikovat hromadně i po jednom, stejně tak jako je
číst).
Konstantu PI importujte z modulu Obrazec.
Modul Obrazec:
package Obrazec;
use Exporter;
@ISA = qw(Exporter);
our @EXPORT = qw(PI);
sub new {
my $kdo = shift;
return bless {@_}, ref $kdo || $kdo;
}
sub jmeno {
my $kdo = shift;
return ref $kdo || $kdo;
}
sub nastav_atributy {
my $objekt = shift;
my %atributy = @_;
$objekt->{$_} = $atributy{$_} for keys %atributy;
}
sub dej_atribut {
my $objekt = shift;
return $objekt->{shift()};
}
sub PI () {3.14};
Modul Kruh:
package Kruh;
use Obrazec;
our @ISA = qw(Obrazec);
sub obsah {
my $objekt = shift;
unless (exists $objekt->{prumer}) {
warn "Neni zadan prumer kruhu\n";
} else {
return PI*($objekt->{prumer}/2)**2;
}
}
Modul Ctverec:
package Ctverec;
use Obrazec;
our @ISA = qw(Obrazec);
sub obsah {
my $objekt = shift;
unless (exists $objekt->{strana} or exists $objekt->{uhlopricka}) {
warn "Neni zadana strana nebo uhlopricka ctverce\n";
} elsif (exists $objekt->{strana}) {
return $objekt->{strana}**2;
} else {
return +($objekt->{uhlopricka}/sqrt(2))**2;
}
}
Příklad použití objektů tříd Kruh a Ctverec:
use Kruh;
my $k = new Kruh prumer => 1;
print "jmeno obrazce: ".$k->jmeno."\n";
print "prumer: ", $k->dej_atribut('prumer'), "\n";
print "obsah: ", $k->obsah, "\n";
use Ctverec;
my $c = new Ctverec;
print "jmeno obrazce: ".$c->jmeno."\n";
$c->nastav_atributy(uhlopricka => sqrt(2));
print "uhlopricka: ", $c->dej_atribut('uhlopricka'), "\n";
print "obsah: ", $c->obsah, "\n";
$c->nastav_atributy(barva => cervena, strana => 2);
print "strana: ", $c->dej_atribut('strana'), "\n";
print "obsah: ", $c->obsah, "\n";
my $c2 = new Ctverec;
print $c2->obsah; # varovani, nemame zadany potrebne hodnoty
# do promenne $c2 si ulozim odkaz na objekt tridy Kruh
$c2=$k;
print "obsah : ", $c2->obsah;
S využitím stanradního modulu CGI vygenerujte a vypište kód webové stránky s titulkem "Datum",
obsahující nadpis úrovně 1 "Dnešní datum" a text s aktuálním datem, následovaný horizontální čarou.
Jednou příklad vyřešte tak, že modul CGI použijete objektovým způsobem, podruhé standardním způsobem
(provedete import potřebných jmen).
# objektově orientované použití
use CGI;
my $q = new CGI;
my @time = localtime;
print $q->start_html(-title => 'Datum'),
$q->h1("Datum"),
$q->p("$time[3]. ".(1+$time[4]).". ".(1900+$time[5])),
$q->hr,
$q->end_html;
# standardní použití
use CGI ':standard';
my @time = localtime;
print start_html(-title => 'Datum'),
h1("Datum"),
p("$time[3]. ".(1+$time[4]).". ".(1900+$time[5])),
hr,
end_html;