Abstraktne klass vs pärand
Abstraktne klass ja pärand on kaks olulist objektile orienteeritud mõistet, mida leidub paljudes objektorienteeritud programmeerimiskeeltes nagu Java. Abstraktset klassi võib pidada tavalise (konkreetse) klassi abstraktseks versiooniks, samal ajal kui Pärand võimaldab uutel klassidel teisi klasse laiendada. Abstraktne klass on klass, mida ei saa lähtestada, kuid mida saab pikendada. Seega on abstraktsetel klassidel mõttekas olla ainult siis, kui programmeerimiskeel toetab pärimist. Java-s deklareeritakse abstraktsed klassid abstraktse märksõnaga, märksõna Laiendab aga (super) klassist pärimiseks.
Mis on abstraktne klass?
Tavaliselt ei saa abstraktseid klasse, mida nimetatakse ka abstraktseteks baasklassideks (ABC), kiireks muuta (selle klassi eksemplari ei saa luua). Seega on abstraktsetel klassidel mõttekas olla ainult siis, kui programmeerimiskeel toetab pärimist (võime klassi laiendamisest luua alaklasse). Abstraktsed klassid esindavad tavaliselt abstraktset mõistet või üksust, mille rakendamine on osaline või puudub. Seetõttu toimivad abstraktsed klassid vanemklassidena, millest tuletatakse lapseklassid, nii et lasteklass jagab vanemklassi puudulikke omadusi ja nende täitmiseks saab lisada funktsionaalsust.
Abstraktsed klassid võivad sisaldada abstraktseid meetodeid. Abstraktset klassi laiendavad alaklassid võivad rakendada neid (päritud) abstraktseid meetodeid. Kui lapseklass rakendab kõiki selliseid abstraktseid meetodeid, on see konkreetne klass. Kuid kui see nii ei ole, saab ka lasteklassist abstraktne klass. See kõik tähendab seda, et kui programmeerija nimetab klassi abstraktseks, ütleb ta, et klass on puudulik ja sellel on elemente, mis tuleb pärivate alamklasside kaudu täita. See on kena viis kahe programmeerija vahel lepingu loomiseks, mis lihtsustab tarkvaraarenduse ülesandeid. Programmeerija, kes kirjutab koodi pärimiseks, peab täpselt järgima meetodi definitsioone (kuid loomulikult võib sellel olla ka oma rakendus).
Mis on pärimine?
Pärimine on objektile suunatud mõiste, mis võimaldab uutel klassidel laiendada teisi klasse. Pärandi kontseptsiooni juurutamiseks Java programmeerimiskeeles kasutatakse märksõna Extends. Pärand annab sisuliselt koodi taaskasutuse, võimaldades olemasoleva klassi omadusi ja käitumist laiendada äsja määratletud klassi võrra. Kui uus alaklass (või tuletatud klass) laiendab superklassi (või vanemklassi), pärib see alaklass kõik superklassi atribuudid ja meetodid. Alamklass võib valikuliselt alistada käitumise (pakkuda meetoditele uut või laiendatud funktsionaalsust), mis on päritud vanemklassilt. Tavaliselt ei saa alamklass laiendada mitut superklassi (nt Java keeles). Seetõttu ei saa te laiendusi mitme pärimise jaoks kasutada. Mitme pärimise saamiseks peate kasutama liideseid.
Mis vahe on abstraktsel klassil ja pärandil?
Abstraktsed klassid esindavad tavaliselt abstraktset mõistet või olemit, mille rakendamine on osaline või puudub. Pärand võimaldab uutel klassidel laiendada teisi klasse. Kuna abstraktseid klasse ei saa instantiseerida, peate abstraktsete klasside kasutamiseks kasutama pärandi mõistet. Vastasel juhul pole abstraktsel klassil mingit kasu. Abstraktsed klassid võivad sisaldada abstraktseid meetodeid ja klassi pikendamisel on kõik meetodid (abstraktsed ja konkreetsed) päritud. Päritud klass võib rakendada kõiki või kõiki meetodeid. Kui kõiki abstraktseid meetodeid pole rakendatud, saab sellest klassist ka abstraktne klass. Klass ei saa pärida rohkem kui ühest abstraktsest klassist (see ei ole abstraktsete klasside omadus iseenesest, vaid pigem pärimise piiramine).