Alamklass: tähendus ja näited programmeerimises ning taksonoomias
Alamklass võib tähendada:
- programmeerimises — klassi, mis pärib omadused ja käitumise teisest klassist (baas- või ülemklassist);
- taksonoomias — taksonoomilist aste (rank), mis paikneb klassi all ja sageli infraklassi kohal.
Alamklass programmeerimises (objektorienteeritud pärimine)
Objektorienteeritud programmeerimises on alamklass klass, mis pärib teise klassi (tuntud ka kui ülemklass, baasklass või superklass) atribuute ja meetodeid. Alamklass võib:
- lisada uusi välju ja meetodeid;
- muuta (override) ülemklassis defineeritud meetodeid, et anda neile spetsiifilisem käitumine;
- kasutada ülemklassi tegevust läbi
super
-kõnede (sõltuvalt keelest).
Tavapärased põhimõtted ja mõisted:
- "is-a" suhe: alamklass peaks olema ülemklassi erijuht — näiteks Hobune is-a Loom;
- Liskovi asendatavuse printsip: instantsid alamklassist peaksid olema asendatavad ülemklassi instantsidega ilma ootamatute käitumiseta;
- meetodite ülekatmine (overriding) vs ülekoormus (overloading) — overriding muudab päriliku meetodi käitumist, overloading on sama nimega meetodite erinevate parameetritega olemasolu;
- ligipääsu modifikaatorid: paljudes keeltes (nt Java, C#) mõjutavad private, protected ja public seda, mida alamklass näeb ja mida ta saab pärida;
- abstraktsed klassid ja liidesed: abstraktne ülemklass võib jätta mõningad meetodid implementeerimata, mille eest vastutab alamklass; liidesed annavad lepingulise käitumise, mida alamklass peab järgima.
Lihtne Java näide:
class Loom { String nimi; void liigu() { System.out.println("Loom liigub"); } } class Hobune extends Loom { int kiirus; @Override void liigu() { System.out.println(nimi + " galoppeerib"); } }
Pythonis võib alamklassid olla ka mitmepärilised (multiple inheritance):
class A: def tere(self): print("A") class B: def tere(self): print("B") class C(A, B): # C pärib A ja B käitumise pass
Mõned ohud ja head tavad:
- Kompositsioon vs pärimine: sageli on parem kasutada kompositsiooni (üks objekt sisaldab teist) kui pärimist, kui suhe ei ole tõeliselt "is-a".
- liigne pärimine: liiga sügav pärimispuu võib muuta koodi raskesti hooldatavaks;
- diamond-probleem: mitmepärimise puhul võib tekkida olukord, kus sama ülemklass pärandub mitme teekonna kaudu — keeled seda lahendavad erinevalt (Python MRO, C++ virtuaalne pärimine, Java ei toeta mitmepärimist klasside puhul).
Alamklass taksonoomias (bioloogiline ja süsteemne taksonoomia)
Taksonoomias on alamklass (ladina keeles subclassis) klassist madalam taksonoomiline aste ja tihti infraklassist kõrgem. See aste kasutatakse elusolendite rühmitamiseks, kui klassi sees on selgelt eristatavad alamrühmad.
Näited:
- Mammalia (imetajad) — kaks tuntud alamklassi: Prototheria (munast kooruvad imetajad: soomusloomad/munamedjad nagu platüpus ja neljasool) ja Theria (kõigile teistele imetajatele, mis sünnitavad elusaid noori). Theria jaguneb edasi infraklassideks Metatheria (kärntõl) ja Eutheria (platsentaaloomad).
- Aves (linnud) — traditsiooniliselt jagatud alamklassideks Palaeognathae (nt strutse- ja tinamud) ja Neognathae (enamik teisi linde).
Mõned olulised punktid taksonoomias:
- Taksonoomilised astmed (domain, kingdom, phylum, class, order, family, genus, species) on juhised — täiendavaid astmeid (nt subclass, infraclass, superorder) kasutatakse vajaduse korral, kuid nende täpne kasutus võib eri taksonoomilistes koolkondades erineda.
- Nimed ja klassifikatsioonid võivad muutuda teadusliku tõenduse (nt geneetika) põhjal.
- Alamklass annab lisatasandi eristuse, mis aitab kirjeldada suuurühmade sisemist mitmekesisust.
Kokkuvõte ja soovitused
- Programmeerimises on alamklass viis taaskasutada ja eristada käitumist, kuid seda tuleks kasutada kaalutletult — eelistada selget "is-a" suhet ning kaaluda kompositsiooni, kui see sobib paremini.
- Taksonoomias kasutatakse alamklassi siis, kui klassi sisene jaotus vajab ametlikku lisaastet; see on osa hierarhilisest süsteemist, mis ajas muutub teadusliku arusaama põhjal.
- Sõltumata valdkonnast tähendab alamklass üldjuhul mingil määral eripära ja pärandumist — oluline on mõista selle positsiooni laiemas struktuuris (koodis või bioloogilises klassifikatsioonis).