Abstraktne klass vs pärimine
Abstraktne klass ja pärimine on kaks olulist objektorienteeritud mõistet, mida leidub paljudes objektorienteeritud programmeerimiskeeltes, näiteks Java. Abstraktset klassi võib pidada tavapärase (betooni) klassi abstraktseks versiooniks, samas kui pärimine võimaldab uutel klassidel laiendada teisi klasse. Abstraktne klass on klass, mida ei saa initsialiseerida, kuid mida saab laiendada. Seega on abstraktsetel klassidel tähendus ainult siis, kui programmeerimiskeel toetab pärimist. Java-s deklareeritakse abstraktseid klasse märksõnaga Abstract, laiendatud märksõna aga (super) klassist pärimiseks.
Mis on abstraktne klass?
Tavaliselt ei saa abstraktseid klasse, mida tuntakse ka kui abstraktseid alusklasse (ABC), realiseerida (selle klassi eksemplari ei saa luua). Seega on abstraktsetel klassidel tähendus ainult siis, kui programmeerimiskeel toetab pärimist (võime luua alamklassid klassi laiendamisest). Abstraktsed klassid tähistavad tavaliselt abstraktset kontseptsiooni või üksust kas osaliselt või ilma rakendamata. Seetõttu toimivad abstraktsed klassid lapsevanemaklassidena, millest tuletatakse lasteklassid, nii et lasteklass jagab vanemklassi mittetäielikke funktsioone ja funktsionaalsuse saab nende täiendamiseks lisada.
Abstraktsed klassid võivad sisaldada abstraktseid meetodeid. Abstraktset klassi laiendavad alaklassid võivad neid (päritud) abstraktseid meetodeid rakendada. Kui lasteklass rakendab kõiki selliseid abstraktseid meetodeid, on see konkreetne klass. Kuid kui see ei õnnestu, muutub lasteklass ka abstraktseks klassiks. See kõik tähendab, et kui programmeerija nimetab klassi abstraktseks, väidab ta, et klass on puudulik ja sellel on elemente, mis tuleb pärandi alaklasside järgi täita. See on kena viis kahe programmeerija vahel lepingu sõlmimiseks, mis lihtsustab tarkvaraarenduse ülesandeid. Programmeerija, kes kirjutab pärimiseks koodi, peab täpselt järgima meetodi määratlusi (kuid loomulikult võib tal olla oma teostus).
Mis on pärimine?
Pärimine on objektorienteeritud kontseptsioon, mis võimaldab uutel klassidel laiendada teisi klasse. Laiendamise märksõna kasutatakse Java programmeerimiskeeles pärimise kontseptsiooni rakendamiseks. Pärimine pakub sisuliselt koodi taaskasutamist, võimaldades olemasoleva klassi omadusi ja käitumist laiendada äsja määratletud klassile. Kui uus alaklass (või tuletatud klass) laiendab superklassi (või vanema klassi), pärib see alaklass alaklassi kõik atribuudid ja meetodid. Alamklass võib valikuliselt alistada vanemklassilt päritud käitumise (pakkuda meetoditele uut või laiendatud funktsionaalsust). Tavaliselt ei saa alamklass laiendada mitut superklassi (nt Java-s). Seetõttu ei saa mitme pärimise korral laiendeid kasutada. Mitme pärimise saamiseks peate kasutama liideseid.
Mis vahe on abstraktsel klassil ja pärandil??
Abstraktsed klassid tähistavad tavaliselt abstraktset kontseptsiooni või üksust, millel on osaline rakendamine või ilma selleta. Pärimine võimaldab uutel klassidel laiendada teisi klasse. Kuna abstraktseid klasse ei saa kiirendada, peate abstraktsete klasside kasutamiseks kasutama pärandi mõistet. Muidu pole abstraktsel klassil mingit kasu. Abstraktsed klassid võivad sisaldada abstraktseid meetodeid ja kui klassi laiendatakse, päritakse kõik meetodid (abstraktne ja konkreetne). Päritud klass saab rakendada kõiki või kõiki meetodeid. Kui kõiki abstraktseid meetodeid ei rakendata, muutub see klass ka abstraktseks klassiks. Klass ei saa pärida rohkem kui ühest abstraktsest klassist (see ei ole iseenesest abstraktsete klasside kvaliteet, vaid pigem pärimise piirang).