OBJEKTNO PROGRAMIRANJE - DEDOVANJE

OBJEKTNO PROGRAMIRANJE - DEDOVANJE

Avtor: Petra Velikanje

UVOD

Ključni koncept objektnega programiranja je dedovanje.


Pomen dedovanja je v tem, da iz že zgrajenih razredov lahko naredimo bolj kompleksne razrede, ki bodo znali narediti kaj uporabnega.


Dedovanje je orodje, s katerim se izognemo ponavljanju pri definiranju različnih razredov, ki pa imajo več ali manj značilnosti skupnih. Dedovanje opredeljuje torej odnos med posameznimi razredi.


Vzemimo primer v geometriji. Pravokotnik je lik. Se pravi, da bo razred Pravokotnik dedoval od razreda Lik. V našem primeru je Lik bazični razred, Pravokotnik pa izpeljani razred.

BAZIČNI RAZREDI IN IZPELJANI RAZREDI

Bazični razred je razred od katerega drugi razred deduje. Razred, ki deduje od bazičnega razreda pa imenujemo izpeljani razred. Vsak izpeljani razred pa je lahko tudi bazični razred razreda, ki deduje od njega. Izpeljanemu razredu poleg podedovanih lastnosti in metod lahko dodamo tudi lastnosti in metode, ki jih vsebuje samo ta razred.


Sintaksa, ki jo uporabimo za deklaracijo, s katero povemo da neki razred deduje od drugega:

class IzpeljaniRazred: BazičniRazred
{
    //…(vsebina razreda)
}

Razred v C# lahko deduje od največ enega razreda in ni možno, da deduje od dveh ali več razredov.

PRIMER

Dedovanje bomo pokazali na primeru psa. Pes spada med živali, zato bomo najprej ustvarili razred Zival. Razred Zival bo naš bazični razred. Nato pa bomo iz razreda Zival izpeljali razred Pes.

public class Zival
    {
        //lastnosti
        private string vrstaZivali;
        private string oglasamSe;

        public Zival(string vrsta, string zvok)//konstruktor
        {
            vrstaZivali = vrsta;
            oglasamSe = zvok;
        }
        //telo razreda

    }

Sedaj, ko imamo bazični razred Zival napisan lahko izpeljemo razred Pes s katerim bomo lahko delali objekte tipa Pes. Potrebi dodamo še metode. Izpeljani razred pa definiramo takole:

public class Pes:Zival
    {
        private string kajJem;//Dodatna lastnost poleg podedovanih lastnosti iz razreda Zival.
        private string kajRadPočnem;//Dodatna lastnost poleg podedovanih lastnosti iz razreda Zival.
        //Telo razreda Pes - tukaj lahko zapišemo še dodatne metode.
    }

Opozorilo: Moramo narediti tudi referenco na ta razred sicer nam razreda Zival ne prepozna oziroma v kodi besedo Zival podčrta rdeče.

using zival;

KAKO KLIČEMO KONSTRUKTOR BAZIČNEGA RAZREDA?

Vsak deklariran razred ima vsaj en konstruktor. V primeru, da konstruktorja ne napišemo nam prevajalnik sam zgenerira privzeti konstruktor. Izpeljani razred avtomatično vsebuje vse lastnosti bazičnega razreda a te lastnosti je potrebno ob kreiranju novega objekta ponovno poklicati. Zaradi tega moramo s pomočjo konstruktorja v izpeljanem razredu poklicati konstruktor bazičnega razreda. V ta namen pa uporabljamo besedo base.

class IzpeljaniRazred: BazičniRazred
{
    public IzpeljaniRazred (paramentri)
    :base(parametri BazičniRazred) //klic bazičnega konstruktorja razreda BazičniRazred.
    {
        //telo konstruktorja razreda IzpeljaniRazred
    }
    //telo razreda IzpeljaniRazred
}


Če vrstice :base(parametri BazičniRazred) ne napišemo, bo predvajalnik sam zgeneriral privzeti konstruktor. Ker pa nimajo vsi razredi privzetega konstruktorja, moramo ta klic bazičnega konstruktorja znotraj izpeljanega razreda nujno opraviti saj v primeru, da ga ne kličemo bo prevajalnik javil napako.

PRIMER

Pokažimo teorijo s prejšnje prosojnice še na našem primeru. Znotraj razreda Pes ustvarimo konstruktor, ki kliče konstruktor bazičnega razreda.

public Pes(string vrsta,string zvok,string hrana, string igra)
            :base(vrsta,zvok)
        {
            kajJem = hrana;
            kajRadPočnem = igra;
        }

Pri deklariranju konstruktorja moramo paziti, da napišemo vse parametre ter da kličemo bazični konstruktor.

NOVE METODE

razredi vsebujejo tudi razne metode. Slej ko prej se zgodi, da se pri dedovanju v izpeljanih razredih ime metode ponovi. Ko bomo program prevedli bomo nam bo prevajalnik posredoval opozorilo - warning. V tem primeru se namreč metoda v bazičnem razredu prekrije z istoimensko metodo v izpeljanem razredu. S tem ko nam prevajalnik posreduje opozorilo nas opozori na to, da smo metodo prekrili. Ta problem pa lahko rešimo tako da eksplicitno povemo da gre za novo metodo - to naredimo tako, da v glavi metode, takoj na začetku napošemo operator new.

new public void Izpisi()
{
}

PRIMER

V razredu Zival imamo metodo Izpisi(), ki nam izpiše objekt.

 public void Izpisi()
        {//izpišemo objekt.
            string izpis="" + VrstaZivali.ToString() + ";" + OglasamSe.ToString();
            Console.WriteLine(izpis);
        }

V razredu Pes pa bi radi imeli metodo z istim imenom, vendar nebi radi povozili metode iz bezičnega razreda. To naredimo tako, da uporabimo operator new.

new public void Izpisi()
        {//izpisemo objekt
            Console.WriteLine(KajJem.ToString()+"--"+KajRadPocnem.ToString();
        }

PRIMER - FILMČEK

DODATNE NALOGE

1.NALOGA: Imamo deklariran razred Zival. Radi bi izpeljali razred Macka. Ustvari polni konstruktor v razredu Macka.

2. NALOGA: Imamo deklariran razred Zival. Razred vsebuje tudi metodo Izpisi(), katera izpiše lastnosti objekta tipa Zival ločene s podpičjem. Ustvari izpeljan razred Macka, ki ima lastnosti ImeMacke, Teza ter KajJem. izpeljan razred naj vsebuje tudi metodo Izpisi(), katera nam izpiše lastnosti objekta tipa Macka ločene s podpičjem.

3. NALOGA: Imamo deklariran razred Zival. Radi bi izpeljali razred Pujs. Ustvari polni konstruktor v razredu Pujs.

4. NALOGA: Imamo deklariran razred Zival. Razred vsebuje tudi metodo Izpisi(), katera izpiše lastnosti objekta tipa Zival ločene s podpičjem. Ustvari izpeljan razred Pujs, ki ima lastnosti ImePujsa,ter Teza. izpeljan razred naj vsebuje tudi metodo Izpisi(), katera nam izpiše lastnosti objekta tipa Macka ločene z vezajem.

5.NALOGA: Imamo deklariran razred Zival. Radi bi izpeljali razred Zajec. Ustvari polni konstruktor v razredu Zajec.

KVIZ

Kaj opredeljuje dedovanje v C#

Preveri

Kaj je bazični razred?

Preveri

Kakšna je sintaksa za deklaracijo izpeljanega razreda

Preveri1

Kaj označuje beseda base?

Preveri1

Za kaj uporabljamo operator new?

Preveri1

Pravilno

Odgovor je pravilen.

Naprej

Narobe

Odgovor ni pravilen. Ponovno

Pravilno

Odgovor je pravilen. Naprej

Narobe

Odgovor ni pravilen. Ponovno

Pravilno

Odgovor je pravilen. Naprej

Narobe

Odgovor ni pravilen. Ponovno

Pravilno

Odgovor je pravilen. Naprej

Narobe

Odgovor ni pravilen. Ponovno

Pravilno

Odgovor je pravilen. Naprej

Narobe

Odgovor ni pravilen. Ponovno

VIRI

0%
0%