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).

## Klasės sąsaja
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

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.

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 ().

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

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++ ) 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#, Java, Pascal).

Kitos klasės kontekste apibrėžta klasė vadinama vidine (). 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