Perlo objektų pradžiamokslis: pirmoji dalis
Objekto vaizdavimas
Dažniausiai Perle Paskalio įrašas arba C struktūra, arba C+ klasė yra
saugoma anoniminio asociatyvaus masyvo (hešo) pavidalu. Taip
saugoti yra patogu, nes heše galima saugoti neribotą kiekį
elementų, kuriuos galima pasiekti per unikalų hešo raktą.
Jeigu tik norite kažko panašaus į C struktūrą, tai galima daryti
taip:
$irasas = {
vardas => "Petras",
amzius => 21,
kolegos => [ "Juozas", "Nikolajus", "Vaidas"],
};
Jeigu norite lengviau perskaitomo kodo, galite hešo raktus
rašyti didžiosiomis raidėmis:
$irasas = {
VARDAS => "Petras",
AMZIUS => 21,
KOLEGOS => [ "Juozas", "Nikolajus", "Vaidas"],
};
Norėdami prieiti prie vardo „Petras“ galite rašyti
$irasas->{VARDAS}
, o norėdami gauti kolegų masyvą galite
rašyti @{ $irasas->{KOLEGOS} }
.
Labai panaši idėja yra naudojama ir objektams, tik nereikėtų prieiti
prie objekto sudėtinių dalių prieiti tiesiogiai – tam dažniausiai
yra naudojamos specialiai tam parašytos funkcijos. Galima sakyti kad
objektas turėtų būti tiesiog daiktas, prie kurio duomenų reiktų prieiti
tik per specialias jo funkcijas.
Klasės sąsaja
Tarkim, kad turim klasę Asmuo
. Štai kaip būtų galima ja
naudotis:
use Asmuo;
$jo = Asmuo->naujas();
$jo->vardas("Petras");
$jo->amzius(21);
$jo->kolegos( "Juozas", "Nikolajus", "Vaidas" );
push @Visi_asmenys, $jo; # išsaugom objektą vėlesniam naudojimui
printf "%s turi %d metus.\n", $jo->vardas, $jo->amzius;
print "Jo kolegos yra: ", join(", ", $jo->kolegos), "\n";
printf "Paskutinis asmuo yra %s\n", $Visi_asmenys[-1]->vardas;
Kaip matote, klasės Asmuo
vartotojas nežino (ir neturi
žinoti) kaip yra saugomi duomenys klasėje Asmuo
. Visus
duomenis vartotojas pasiekia tik per metodus (t.y. funkcijas, kurios
priklauso klasei)
Konstruktoriai ir objekto metodai
Tačiau kažkas turi žinoti, kaip duomenys saugomi klasėje, ir
tas kažkas yra pati klasė. Klasė aprašo metodus, kuriais
naudojanti galima prieiti prie prie objekto duomenų. Štai kaip galima
aprašyti klasę Asmuo
naudojantis standartiniu duomenų
saugojimo hešo nuorodoje būdu. Aprašysime klasės metoda
naujas()
, kuris bus objekto konstruktorius, bei tris
objekto metodus vardas()
, amzius()
ir
kolegos()
per kuriuos bus galima prieiti prie objekte
saugomų duomenų.
package Asmuo;
use strict;
####################################################
## objekto konstruktorius (supaprastinta versija) ##
####################################################
sub naujas {
my $mano = {};
$mano->{VARDAS} = undef;
$mano->{AMZIUS} = undef;
$mano->{KOLEGOS} = [];
bless($mano); # bet zr. zemiau
return $mano;
}
##############################################
## metodai objektu duomenis pasiekti ##
## ##
## Metodai nustato reikšmę, jei perduodamas ##
## argumentas, ir tik grąžina reikšmę jei ##
## argumentai neperduodami ##
##############################################
sub vardas {
my $mano = shift;
if (@_) { $mano->{VARDAS} = shift }
return $mano->{VARDAS};
}
sub amzius {
my $mano = shift;
if (@_) { $mano->{AMZIUS} = shift }
return $mano->{AMZIUS};
}
sub kolegos {
my $mano = shift;
if (@_) { @{ $mano->{KOLEGOS} } = @_ }
return @{ $mano->{KOLEGOS} };
}
1; # Tam kad 'use' arba 'require' nesikeiktų
Sukūrėme tris metodus, per kuriuos galima prieiti prie objekto duomenų:
vardas()
, amzius()
ir kolegos()
.
Jie labai panašūs. Jei nustato reikšmę jeigu iškviečiami su argumentu,
ir grąžina reikšmę jeigu iškviečiami be argumentų.