Наслеђивање
Наслеђивање је основни концепт у објектно-оријентисаном програмирању којим се омогућава креирање нових класа из постојећих класа. Класа из које се наслеђује назива се базна класа (енгл. base class), а класа која наслеђује базну класу назива се изведена класа (енгл. derived class). У изведеној класи наслеђују се чланови базне класе, а могу се дефинисати и нови чланови или променити постојећи. Наслеђивање омогућава поновну употребу кода и његову организацију на логичан начин, на пример у виду хијерархијске структуре класа тј. стабла класа. Овој теми биће посвећено једно цело поглавље. У литератури на српском језику, "базна класа" назива се и "основна класа", "надкласа" или "родитељска класа", док се "изведена класа" назива и "наслеђена класа", "поткласа" или "класа потомка".
Једноставан пример хијерархије класа за твоју школу могао би да изгледа овако:
classDiagram
class Osoba {
private string ime
private string prezime
private string jmbg
public bool dodaj()
public bool izmeni()
public bool obrisi()
public bool prikazi()
public List<Osoba> prikaziSve()
}
class Ucenik {
private string idUcenika
private string odeljenje
public bool prikaziUcenika()
public bool promeniOdeljenje()
public List<Ucenik> prikaziSveUcenike()
}
class Zaposleni {
private string idZaposlenog
private Date datumZaposlenja
private string strucnaSprema
private int obracunajStaz()
public bool prikaziStaz()
public bool prikaziZaposlenog()
public List<Zaposleni> prikaziSveZaposlene()
}
class Nastavnik {
private[] string predmeti
public bool dodajPredmet()
public bool ukloniPredmet()
public bool prikaziPredmete()
public bool prikaziNastavnika()
public List<Nastavnik> prikaziSveNastavnike()
}
class NenastavnoOsoblje {
private string radnoMesto
public bool prikaziRadnika()
public List<NenastavnoOsoblje> prikaziSveRadnike()
}
Osoba <|-- Ucenik
Osoba <|-- Zaposleni
Zaposleni <|-- Nastavnik
Zaposleni <|-- NenastavnoOsoblje
Школу похађају ученици, а у школи раде запослени. Запослени могу бити наставници или ненаставно особље. Заједничко за све особе у школи је да имају ЈМБГ, име и презиме. За ученике је битно навести у којем су одељењу. За све запослене битно је навести степен стручне спреме и годину запослења, како би им се обрачунао стаж. За наставника поред тога треба навести и предмете који предаје, а за ненаставно особље који посао обављају.
Посматрај једну изведену класу на дијаграму, на пример класу Nastavnik
. Она је изведена из класе Zaposleni
, а класа Zaposleni
из класе Osoba
. У изведеној класи Nastavnik
, наслеђени су чланови класа који се у хијерархији наслеђивања налазе изнад ње.
Из овог примера можеш да закључиш да наслеђивање омогућава поновну употребу постојећег кода, што смањује дуплирање кода и убрзава развој. Нове функционалности могу да се додају у изведене класе без потребе за изменом постојећих класа, што олакшава одржавање и проширење система.
Такође, наслеђивање омогућава логичку организацију класа, тј. хијерархију класа, што побољшава читљивост и структуру кода.
У различитим програмским језицима постоје различити типови наслеђивања класа:
Једноструко наслеђивање: изведена класа наслеђује једну базну класу (најчешћи облик наслеђивања, једноставан за управљање):
classDiagram
class БазнаКласа {
атрибути базнеКласе
методе базнеКласе()
}
class ИзведенаКласа {
атрибути изведенеКласе
методе изведенеКласе()
}
БазнаКласа <|-- ИзведенаКласа
Вишеструко наслеђивање: изведена класа истовремено наслеђује више базних класа (сложена структура, потенцијални конфликти, C# не подржава вишеструко наслеђивање класа):
classDiagram
class БазнаКласа1 {
атрибути базнеКласе1
методе базнеКласе1()
}
class БазнаКласа2 {
атрибути базнеКласе2
методе базнеКласе2()
}
class ИзведенаКласа {
атрибути изведенеКласе
методе изведенеКласе()
}
БазнаКласа1 <|-- ИзведенаКласа
БазнаКласа2 <|-- ИзведенаКласа
Вишесложно наслеђивање: једна изведена класа је наслеђена из друге изведене класа (чест облик наслеђивања):
classDiagram
class БазнаКласа {
атрибути базнеКласе
методе базнеКласе()
}
class ИзведенаКласа1 {
атрибути изведенеКласе1
методе изведенеКласе1()
}
class ИзведенаКласа2 {
атрибути изведенеКласе2
методе изведенеКласе2()
}
БазнаКласа <|-- ИзведенаКласа1
ИзведенаКласа1 <|-- ИзведенаКласа2
У дијаграму изнад, БазнаКласа
је базна класа за ИзведенаКласа1
, а ИзведенаКласа1
је базна класа за ИзведенаКласа2
.
Хијерархијско наслеђивање: једна базна класа је базна класа за више изведених класа (чест облик наслеђивања):
classDiagram
class БазнаКласа {
атрибути базнеКласе
методе базнеКласе()
}
class ИзведенаКласа1 {
атрибути изведенеКласе1
методе изведенеКласе1()
}
class ИзведенаКласа2 {
атрибути изведенеКласе2
методе изведенеКласе2()
}
БазнаКласа <|-- ИзведенаКласа1
БазнаКласа <|-- ИзведенаКласа2
У дијаграму изнад, БазнаКласа
је базна класа и за ИзведенаКласа1
и за ИзведенаКласа2
.
Хибридно наслеђивање: подразумева комбинацију више типова наслеђивања.