Virtual in override

Virtual in override

Avtor: Andrej Pavšič

Override

Spremenljivko override uporabljamo pri deklaracji metod, lastnosti in dogodkov. Ta zagotavlja novo implementacijo člana podedovanega iz baznega razreda.

Metoda iz baznega razreda, ki jo povozi deklarirana override metoda, (overriden base method) mora imeti enako signaturo kot sama override metoda.

Spremenljivke, ki jih lahko uporabimo pri določanju override metode so:

  • new,
  • static,
  • virtual,
  • abstract.

Virtual

Beseda virtual je v programskem jeziku C# rezervirana za deklaracijo metod in lastnosti. Virtualne metode se po lastnosti obnašajo kot abstraktne, razlika je edino v sintaksi pri klicanju.

Virtualnih spremenljivk ne smemo pripisovati statičnim metodam. Implementacija virtualnih članov je možna z override metodo.

Virtual & Override

Podrazredi lahko vsebujejo metode z enakimi imeni kot jih imajo metode v baznem razredu.

  • V tem primeru mora biti bazna metoda deklarirana kot virtual.
  • Prevajalnik bo javil napako če v podrazredih pred metodami ne bomo uporabili oznak new ali override.
  • Z oznako new v podrazredu metodo napravimo neodvisno od baznega razreda.
  • Pri uporabi override pri metodi v podrazredu bodo objekti klicali to metodo namesto metode iz baznega razreda.
    V C# virtualne metode podpirajo polimorfizem. To dosežemo pri uporabi kombinacije virtual in override skupaj. Metoda virtual nastopa v baznem razredu, metodo override pa uporabimo v podrazredih, za metodi obeh tipov pravimo da so virtualne.
    V podrazredu, ki deduje od baznega, lahko podedovano virtualno lastnost povozimo z deklarirano ovverride metodo. Pri tem pa velja, da mora biti signatura pri deklaraciji override in virtual metode enaka.


        class ure
        {
            public virtual void kazalci(){ Console.WriteLine("Ura brez kazalcev."); }

        }
        class stenska : ure
        {
            public override void kazalci(){ Console.WriteLine("Imamo urni in minutni kazalec."); }

        }


Seveda pa lahko iz podrazreda dostopamo do virtualne metode iz baznega. To storimo s pomočjo ključne besede »base«.

        base.kazalci();

»Method Hidding«

Če pri klicu metode iz podrazreda ne želimo povoziti virtualne metode iz baznega razreda, lahko to preprečimo s pomočjo skrivanja. Pri deklaraciji take metode namesto spremenljivke override uporabimo spremenljivko new. Efektivno sta ti dve metodi ločeni, imata pa enako signaturo.

         class A
        {
            public virtual void Fun() { Console.WriteLine("A"); }
        }

        class B : A
        {
            public new void Fun() { Console.WriteLine("B"); }
        }

        class C : A
        {
            public override void Fun() { Console.WriteLine("C"); }
        }


Pri el2 virtualno metodo povozi override iz C razreda, medtem ko pri el1 do tega ne pride, saj nam to preprečuje new pri deklaraciji metode Fun v razredu B.

            A el1 = new B();
            el1.Fun();  // output --> "A"

            A el2 = new C();
            el2.Fun(); // output --> "C"

Razlika med virtualnimi in ne-virtualnimi metodami

Glavna razlika med virtualnimi in ne-virtualnimi metodami je ta, da so ne-virtualne metode izbrane statično oz. se izvedejo v prevajanem času,virtualne metode po se razrešujejo dinamično oz. v času delovanja programa (v run-time času).

Z override ne moremo povoziti ne-virtualnih in statičnih metod. »Overriden base method« oz. lastnost te metode iz baznega razreda mora biti tipa virtual, abstract ali override!

Zgled

Uporaba virtualnih metod je smiselna, ko v baznem razredu opišemo nek tip, v podrazredih pa funkcionalnost tega razreda povečamo ali na novo določimo. Recimo da v baznem razredu Pes definiramo metodo lajež, v podrazredih NemškiOvčar, Terier, Dalmatinec pa definiramo metode, ki natančneje opredeljujejo laježe posameznih pasem.

Včasih imamo v baznem razredu metodo, ki je uporabna tudi v metodah podrazredov. Primer: ploščina kvadrata in kocke. Ploščina kocke je enaka ploščinam šestih enakih kvadratov, ki sestavljajo plašč kocke. Bazni razred je kvadrat, podrazred pa kocka. V takem primeru pri metodi za računanje ploščine kocke uporabimo že definirano metodo za računanje ploščine iz baznega razreda. Pri override metodi bomo tako klicali bazno metodo s pomočjo določila base.

        public class Kvadrat
        {
            public double x;
            public Kvadrat(double x)
            { this.x = x; }

            public virtual double Ploscina()
            { return x * x; }
        }

        class Kocka : Kvadrat
        {
            public Kocka(double x) : base(x) { }

            public override double Ploscina()
            { return (6 * (base.Ploscina())); }
        }

Viri in literatura

0%
0%