Klasė (programavimas)

Klasė (objektiniame programavime) - aprašas, nusakantis tam tikro tipo objektų duomenų struktūrą ir manipuliavimo jais taisykles (elgesį).

Pavyzdžiui, jei aprašome klasę „Žmogus“, galėsime kurti šios klasės objektus kiekvienam konkrečiam asmeniui, šie objektai turės bendrą duomenų struktūrą, tačiau skirtingas reikšmes (skirsis ūgis, svoris, lytis, vardas).[1]

Klasės sąsaja

redaguoti

Kiekviena klasė gali realizuoti vieną ar daugiau interfeisų (sąsajų), kuriuose aprašomos metodų signatūros. Klasė gali būti naudojama tiesiogiai ar per vieną iš realizuojamų interfeisų. Interfeisai leidžia realizuoti tam tikrą funkcionalumą abstrakčiai, tada funkcionalumas vienodai veiks su bet kuria klase, realizuojančia interfeisą.

Klasės struktūra

redaguoti
 
UML notacija

Klasė aprašo objekte saugomus duomenis, daugelyje programavimo kalbų vieta saugoti tam tikro tipo duomenims yra vadinama atributu, kurių konkrečių reikšmių visuma nusako konkretaus objekto būseną. Geri OOP principai reikalauja, kad objekto būsena turi būti inkapsuliuojama ir gali būti pakeista ar perskaityta tik per klasėje aprašytus metodus.[2]

Kai kurie klasės atributai gali būti bendri visiems tos klasės objektams (t. y. pakeitus vieno objekto atributo a reikšmę, keičiasi ir kito tos pačios klasės objekto atributo a reikšmė). Tokio tipo atributai vadinami statiniais atributais.

Klasė taip pat nusako ir duomenų vientisumo taisykles, kurios turi būti tenkinamos po kiekvieno metodo kvietimo. Tai yra esminis skirtumas nuo duomenų struktūrų, kur galima bet kuri įmanoma būsena, tuo tarpu klasės objektas gali pereiti tik į tam tikras būsenas. Nesilaikant inkapsuliacijos, būsenos vientisumas gali būti pažeistas.

Klasėse taip pat apibrėžiamos specialios kūrimo ir naikinimo funkcijos – konstruktorius ir destruktorius. Konstruktorius gali būti naudojamas pradinio objekto sukūrimui (be parametrų) arba objekto sukūrimui pagal pradinius duomenis (su parametrais). Destruktoriuje gali būti atlaisvinami išoriniai resursai, nuorodos į kitus objektus. Į destruktorių panašus metodas būna ir tada, kai nebereikalingus objektus naikina ne programos kodas, o šiukšlių surinktuvas. Tuomet jis vadinamas užbaigikliu (angl. finalizer).

Analogiškai kaip ir statiniai atributai, klasėje gali būti apibrėžti ir statiniai metodai, kurie gali būti naudojami keisti statinių atributų reikšmes. Statiniai metodai, skirtingai nuo nestatinių, taip pat gali būti iškviečiami net ir nesukūrus (neinstancijavus) nei vieno tos klasės objekto. Tokie metodai taip pat dažnai naudojami objektų kūrimui, radimui, naikinimui.

Poklasiai ir viršklasiai

redaguoti
 
Paveldimumas

Dažnai klasės vienaip ar kitaip susijusios. Dažniausias sąryšis – paveldimumas, kur žemesnės klasės (ar vaikų klasės) paveldi duomenų struktūras ir metodus iš aukštesnių klasių (tėvinių klasių). Paveldėtos klasės paprastai keičia tėvinės klasės funkcionalumą – prideda naujų metodų ar duomenų, perrašo ar uždraudžia kai kuriuos metodus.

Paveldėjimo ryšys dažnai pakeičiamas junginiu „yra“ (pvz., „Pingvinas yra Paukštis“).

Metodas, apibrėžtas bendresnėje klasėje, gali būti iš naujo deklaruojamas ir apibrėžiamas iš jos kildinamoje konkretesnėje klasėje. Mūsu pavyzdyje metodas Perėti gali būti deklaruotas klasėje Paukštis ir atskirai aprašytas ereliui ir pingvinui, nes šie du paukščiai perėjimo metu elgiasi ne taip pat.

Kiekvienas objektas turi programuotojui nematomą laukelį, tiesiogiai ar netiesiogiai nurodantį būtent šio objekto klasę. Todėl su konkrečiu objektu galima elgtis ir kaip su bendresnei klasei priklausančiu abstrakčiu objektu. Tarkim, galima parašyti funkciją lizdas (Paukštis), kurios parametras gali būti tiek Erelis, tiek ir Pingvinas. Jei toje funkcijoje bus kviečiamas metodas Perėti, kvietimas nukeliaus į būtent to paukščio rūšiai specifinį metodą. Funkcija lizdas bendru atveju nežino, kokį konkrečiai kodą ji iškviečia.

Klasė Paukštis gali turėti savo supaprastintą metodo Perėti versiją, kuri iš bėdos tinka bet kokiam paukščiui. Kitais atvejais metodas Perėti gali būti šioje klasėje tik deklaruotas (abstraktus), neturintis jokio šį veiksmą atliekančio kodo. Abstrakčių metodų turinti klasė vadinama abstrakčia klase. Bet kurio iš tikro egzistuojančio objekto tikroji klasė negali būti abstrakti, tačiau gali būti kildinama iš abstrakčios klasės. Vien abstrakčius metodus turinti klasė pagal apibrėžimą artima interfeisui, tačiau programavimo kalbose jie aprašomi skirtingais raktažodžiais.

Kai kuriose programavimo kalbose (pavyzdžiui, C++ [3]) viena klasė gali būti kildinama iš daugiau negu vienos klasės, tačiau dauguma suteikia tik vienos klasės paveldėjimo galimybę. Dažnai pasitaikantis kompromisas yra leisti paveldimumą iš vienos interfeisu nešančios klasės bei tuo pat metu iš neriboto skaičiaus interfeisų (C#[4], Java[1], Pascal[5]).

Kitos klasės kontekste apibrėžta klasė vadinama vidine (angl. inner class, member class). Vidinės klasės kodas pasiekia visas gaubiančiosios klasės duomenų struktūras (taip pat ir privačias).

Klasės pačios yra objektai. Jas sukuria klasių kroviklis.

Išnašos

redaguoti


    Šiame straipsnyje naudojami diskutuotini terminai.
Daugiau apie kompiuterinius terminus skaitykite žodynėlyje.