Иди на текст

Наслеђивање

Наслеђивање је основни концепт у објектно-оријентисаном програмирању којим се омогућава креирање нових класа из постојећих класа. Класа из које се наслеђује назива се базна класа (енгл. 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.

Хибридно наслеђивање: подразумева комбинацију више типова наслеђивања.