Klasės ir objektai

 

Šiame skyriuje panagrinėsime PERL, kaip objektiškai orentuotos programavimo (OOP) kalbos galimybes. OOP pagrindą sudaro objektai ir klasės bei jų sąvybės: inkapsuliacija, paveldimumas ir polimorfizmas. Klasės - tai duomenų struktūros bei veiksmų, kuriuos galima atlikti su tais duomenimis visuma. Klasės kintamieji vadinami duomenimis, o veiksmai t.y. - metodais. Objektas - tai klasės realizacija. Objekto savybės apibrėžiamos klase, kuriai jis priklauso.

Inkapsuliacija - tai tai duomenų izoliavimas nuo jų pasiekimo iš išorinių paprogramių ar funkcijų.

Paveldimumas - tai klasių savybė paveldėti motininės klasės savybes ir metodus. PERL'e automatiškai paveldimi tik metodai. Duomenų paveldimumas priklauso nuo pogramuotojo. Paveldimumas PERL kalboje realizuojamas per paketų spec. masyvus @ISA, kuriame saugomas kiekvieno paketo bazinių klasių sąrašas.

Polimorfizmas - tai paveldėtųjų klasių savybė keisti motininės klasės metodus.

PERL kalba neturi specialios sintaksės, skirtos klasių objektų ar metodų apibrėžimui. Tam tikslui naudojamos jau žinomos sintaksės konstrukcijos. Taigi PERL kalboje:

Tam kad paketas taptų klase, naudojama speciali paprogramė - konstruktorius.  Jei objekto pavadinimas bus naudojamas, kaip funkcijos ref() argumentas, tuomet bus grąžintas klasės, pagal kurią sukurtas objektas, pavadinimas. Funkcija ref() gali būti naudojama sąlygos  ar priskirimo operatroriuose. Jei funkcijos argumentas objektas – grąžima reikšmė true, jei ne – false.


 
Konstruktorius

Konstruktorius - tai paprogramė, grąžinanti nuorodą. Paprastai konstruktorius vadinamas new vardu. Konstruktoriuje privalo būti funkcija bless(), kuri sukuria objektą (t.y. "šventina" nuorodą į objektus). Šios funkcijos sintaksė:

     bless nuoroda [,klasės_pavadinimas];

 Jei klasės pavadinimas nenurodomas, naudojama einamoji klasė. Jei objektas anskčiau buvo priskirtas kitos klasės atstovu, tai ankstesnis jo "šventinimas" panaikinamas. Į sukurtą objektą galima kreiptis taip: $KLASE::nuoroda.

 Konstruktoriaus pavyzdys:

 sub new {
    my     $obref = {};        # kuriama nuoroda į tuščią asociatyvinį masyvą
    bless  $obref;             # nuoroda padaroma einamos klasės objektu
    return $obref;             # grąžinama nuoroda
}

Objektas dažniausiai kuriamas iš ankščiau sukurtos nuorodos į asociatyvinį masyvą. Tokio tipo nuoroda leidžia turėti bet kokį elementų skaičių ir kreiptis į juos per raktą. Bendruoju atveju objekto kūrimui gali būti naudojami tiek skaliarai tiek ir paprasti masyvai. Jei norima, kad konstruktorius būtų paveldimas, funkcija bless() turi būti naudojama su argumentu, nurodančiu klasės pavadinimą. Toks konstruktorius atrodytų taip:

package Staff;
sub new {
    my $class = shift;   
     # $class priskiriamas klasės pavadinimas, pagal kurį kuriamas objektas
    my $self = {};            
# k
uriama nuoroda į tuščią asociatyvinį masyvą
    bless $self, $class;       # $self pašventinams į objektus
    $self->_initialize();      # iškviečiama privati funkcija
    return $self;
}

#pagrindinės programos fragmentas
use Staff;
$someone =
new(Staff);

 

Metodai

PERL kalboje skiriamos dvi metodų grupės - tai klasės ir objektų metodai. Kitaip jie dar vadinami statiniai ir virtualūs. Pirmas metodo argumentas visad būna nuoroda, reiškianti objektą arba paketą. Pagal tai, kaip metodas elgiasi su pirmuoju argumentu ir skiriami klasės bei objekto metodai.

Klasės metodai taikomi visai klasai klasei, o ne atskiriems objektams. Šių metodų pirmasis argumentas būna klasės pavadinimas, todėl klasės metodai ignoruoja jį. Tipinis tokio metodo pavyzdys - konstruktorius.

Objekto metodai taikomi atskiram objektui. Šių objektų pirmasis argumentas būna nuoroda į objektą. Tokie metodai dažniausiai susiję su objekto duomenų išvedimu ar keitimu ir užtikrina inkapsuliacijos principą objekte.

 sub display {
    my $self = shift;
    my @keys;
    if (@_ == 0) {                       # daugiau nėra argumentų
        @keys = sort keys(%$self);
    }  else {
        @keys = @_;                      # jei yra daugiau argumentų
    }
    foreach $key (@keys) {
        print "\t$key => $self->{$key}\n";
    }
}

Klasių ir objektų metodai iškviečiami naudojant tokias pat sintakės konstrukcijas. Pirmoji sintaksės forma atrodo sekančiai:

    metodas klasė_ar_objektas, parametrai;

Pavyzdžiui:

$somebody = new Staff,{"vardas"=>"Peter"};
showdata $somebody, "vardas", "pavard
ė";
showdata {"vardas"=>"Marija”, "amzius"=> 18};


Kita sintaksės forma:

   klase_ar_objektas->metodas(parametrai);    # parametrai būtinai apskliaudžiami.

Pavyzdžiui

$somebody = new->Staff ( {"vardas"=>"Peter"});
$somebody->showdata ("vardas", "pavard
ė");
new Staff
->showdata ("amzius");


Jei kviečiami metodai iš kitos klasės, tuomet prieš metodą nurodomas paketo pavadinimas, pavyzdžiui:

$fred = MyCritter::find("Critter", "Fred");
MyCritter::display($fred, 'Height', 'Weight');

 Jei tą patį užrašysime taip:

$fred = Critter->MyCritter::find("Fred");
$fred->MyCritter::display('Height','Weight');

tai reikš, kad objektui $fred pirma reikia surasti metodą display, paiešką pradedant nuo paketo MyCritter, po to jį paleisti naudojant  $fred pirmuoju argumentu.

 

 Destruktorius

Kai uždaroma paskutinė nuoroda į objektą, objektas automatiškai naikinamas ir šalinamas iš atminties. Jei norima valdyti šį procesą, galima naudoti objekto destruktorių t.y. metodą, turintį pavadinimą DESTROY. Jis automatiškai bus kviečiamas reikiamu momentu ir gali atlikti tam tikrus papildomus veiksmus, bet tai turi apibrėžti pats metodo kūrėjas. Destruktorius automatiškai neiškviečia kitų destruktorių, todėl uždarius einamąjį objektą, nereiškia, kad bus uždarytas ir jo bazinis objektas. Bendru atveju naudoti destruktorių  nėra būtina, kadangi objekto naikinimo procedūrą kontroliuoja pats interpretatorius.

 

Į turinį