NASLEĐIVANJE

Nasleđivanje je osobina OOP koja omogućava jednoj klasi da nasledi osobine druge klase uz mogućnost dopune i modifikacije bez izmene izvornog koda prve klase.

 

Klasa iz koje se izvode druge klase zove se osnovna klasa (base class - bazna klasa, nadklasa ili superklasa). Klase koje nasleđuju osnovnu klasu zovu se izvedene klase (derived class - podklasa).

Najvažnije osobine nasleđivanja su:


1. Mogućnost ponovne upotebljivosti

2. Mogućnost modifikacije preuzetog sadržaja.  Modifikacija metode zove se redefinisanje (engl. "overriding") i izvodi se tako što se metoda iznova definiše (tj. napiše pod istim imenom) u sklopu potomka.

3. Mogućnost proširivanja, dodavanjem novog sadržaja - u načelu, i atributa i metoda.

4. Kao matematička relacija, nasleđivanje ima osobinu tranzitivnosti sa značenjem: ako klasa C nasleđuje klasu B i klasa B nasleđuje klasu A tada klasa C nasleđuje klasu A.

5. Naslednik se formira ili uvođenjem ograničenja ili dodavanjem semantike (nove logike) ili, naravno, na oba načina.

Pomoću nasleđivanja uvodimo hijerahijsku strukturu u procesu projektovanja programa.

Grupa klasa koje su povezane nasleđivanjem formiraju strukturu koja se naziva hijerarhija klasa.

Tipovi nasleđivanja u programskom jeziku C#:

1) Jednostruko nasleđivanje (single inheritance) – najjednostaniji tip, jedna klasa (izvedena klasa) nasleđuje drugu klasu (osnovnu klasu). Recimo iz klase pravougaonik se nasleđuje klasa kvadrat.

2) Nasleđivanje u više nivoa (multilevel inheritance) – u ovom slučaju klasa nasleđuje neku drugu klasu koja je već nasledila neku klasu.

3) Hijerahijsko nasleđivanje (hierarchical inheritance) – iz jedne osnovne klase mogu da se izvedu više izvedenih klasa odnosno jednu osnovnu klasu mogu da naslede više klasa.

4) Višestruko nasleđivanje – kada jedna klasa nasleđuje više osnovnih klasa, odnosno kada klasa dete potiče od više roditeljskih klasa.

5) Hibridno nasleđivanje – predstavlja kombinaciju gorenavedenih tipova nasleđivanja. Na primer višenivovsko i hijerarhijsko nasleđivanje ili višenivovsko i višestruko nasleđivanje ili višenivovsko, hijerarhijsko i višestruko nasleđivanje.

Sintaksa nasleđivanja:
class BaznaKlasa
{
	... 
}

class IzvedenaKlasa:BaznaKlasa
{
	...
}

Primer 1: klasa Stanica je nastala iz klase Tacka dodavanjem semantike tako što je nadodat atribut naziv stanice.

class Tacka
{
    private double x; 
    private double y;

    public void PromeniPoziciju(double x, double y)
    {
        this.x = x;
        this.y = y;
    }

    public void PrikaziPoziciju()
    {
        Console.WriteLine("x:{0},y:{1}", x, y);
    }
}
class Stanica:Tacka
{
    private string naziv;

    public void Unos()
    {
        Console.WriteLine("Unesite naziv autobuske stanice:");
        naziv = Console.ReadLine();
        Console.WriteLine("Unesite x:");
        double x = Convert.ToDouble(Console.ReadLine());
        Console.WriteLine("Unesite y:");
        double y = Convert.ToDouble(Console.ReadLine());
        PromeniPoziciju(x, y);
     }

     public void Prikaz()
     {
         Console.Write("Naziv:{0}", naziv);
         PrikaziPoziciju();
     }
}
class Program
{
    static void Main(string[] args)
    {
        Stanica st1 = new Stanica();
        st1.Unos();
        st1.Prikaz();
        Console.ReadKey();
    }
}

Zadatak

Napisati program u kojem klasa valjak nasleđuje klasu krug. Atribut klase krug je poluprečnik. Metode u klasi krug su unos poluprečnika, metoda za izračunavanje obima i površine kruga. Atribut klase valjak je visina valjka a metode su za unos visine i poluprečnika, za izračuvanje površine i zapremine valjka. U glavnom programu testirati rad klase valjak tako što će se za uneti poluprečnik i visinu prikazati površina i zapremina valjka.

Klasa System.Object

Nasleđivanje može da bude direktno (eksplicitno)  i indirektno (implicitno).

 

Klasa System.Object je predak svih klasa.

 

To praktično znači da bilo koja klasa može da koristi metode klase System.Object.

- string ToString()  
- bool Equals(object)
- Type GetType()

Vrednosni i ukazni tipovi podataka

Karakteristika vrednosnih tipova podataka je ta da ona na svojoj memorijskoj lokaciji čuva vrednost promenljive

Ukazni tipovi podataka čuvaju adresu promenljive koja se nalazi na heap-u dinamičkoj memoriji.

 

Vrednosni tipovi podataka su: int, float, bool, char, double, struct (struktura).

 

Ukazni tipovi podataka su: klase, stringovi, nizovi.

 

Tip podatka string je definisan unutar klase String dok su nizovi definisani unutar klase Array.

BOXING I UNBOXING

Mehanizam koji od vrednosnog podatka pravi ukazni podatak naziva se pakovanje (boxing). Prilikom pakovanja pravi se primerak objekta na hipu.

int i = 10;
object o = i; //performs boxing

Mehanizam koji od objekta koji sadrži spakovanu vrednost pravi podatak vrednosnog tipa naziva se raspakivanje (unboxing).

object o = 10;
int j = (int)o;

BOXING I UNBOXING

RAZLIKA IZMEĐU STRUKTURE I KLASE

Osnovna razlika između strukture i klase u C# jeste ta da su strukture vrednosni tipovi podataka a da su klase ukazni tipovi podataka.

struct SLocation
{
     public int x, y;
        
     public SLocation(int x, int y)
     {
         this.x = x;
         this.y = y;
     }
}
class CLocation
{
   public int x { get; set; }
   public int y { get; set; }

   public CLocation(int x, int y)
   {
       this.x = x;
       this.y = y;
   }
}

KONTROLA PRISTUPA ČLANOVIMA KLASE

Ukoliko su članovima (atributi i metode) osnovne klase dodeljeni modifikatori pristupa private oni su nedostupni u izvedenoj klasi.

Ovaj problem može da se reši na dva načina:

1) Korišćenjem specifikatora pristupa protected. 

2) Pomoću metoda (kao što su get i set). U ovom slučaju su članovi klase dostupni i van izvedene i osnovne klase ali na bezbedan način.

KONTROLA PRISTUPA KLASAMA

Kod klasa koje su definisane u okviru nekog namespace-a mogućnost pristupa može da bude definisana kao public ili kao internal.  

 

Stepen dostupnosti klase utiče i na stepen dostupnosti njenih članova. Ukoliko je stepen dostupnosti klase internal, član klase iako ima stepen dostupnosti public je dostupan samo unutar projekta gde je definisana klasa.

KONSTRUKTORI IZVEDENIH KLASA

Prilikom kreiranja objekta izvedene klase poziva se konstruktor izvedene klase koji poziva konstruktor osnovne klase.

Deo objekta izvedene klase koji se odnosi na osnovnu klasu kreira se pomoću konstruktora osnovne klase (koji je pozvan od strane konstruktora izvedene klase) a deo objekta koji se odnosi na izvedenu klasu se kreira pomoću konstruktora izvedene klase.

Prilikom kreiranja objekta izvedene klase uvek se prvo kreira deo koji se odnosi na osnovnu klasu pa tek onda deo objekta koji se odnosi samo na izvedenu klasu.

Prilikom konstruisanja objekta izvedene klase poziva se konstruktor izvedene klase koji poziva podrazumevani (ili ugrađeni konstruktor ukoliko podrazumevani nije definisan) konstruktor bazne klase.

class Pravougaonik
{
    protected float a;
    protected float b;

    public Pravougaonik()
    {
        Console.WriteLine("Kreira se pravougaonik");
        a = 1;
        b = 1;
    }
…
}
class Kvadrat:Pravougaonik
{
     public Kvadrat()
     {
         Console.WriteLine("Kreira se kvadrat");
     }
}
//Neka bazna klasa označena sa A ima 
//parametarski konstruktor definisan izrazom
public A(lista argumenata)
{ 
	telo_konstruktora klase A
}  
//konstruktor izvedene klase
public B(lista argumenata osnovne klase): base(lista argumenata osnovne klase)
{
        telo_konstruktora klase B
}
//OPŠTI OBLIK:
public ime_izvedene_klase(lista argumenata osnovne klase): base(lista argumenata osnovne klase)
{
            telo_konstruktora
}

Primer konstruktora izvedene klase:

class Pravougaonik
{
    protected float a;
    protected float b;

    public Pravougaonik():this(1,1)
    {
         Console.WriteLine("Kreira se pravougaonik");    
    }

    public Pravougaonik(float a, float b)
    {
        Console.WriteLine("Kreira se pravougaonik");
        this.a = a;
        this.b = b;
    }
}
class Kvadrat:Pravougaonik
{
    public Kvadrat()
    {
        Console.WriteLine("Kreira se kvadrat");
    }

    public Kvadrat(float a): base(a,a)
    {
        Console.WriteLine("Kreira se kvadrat");
    }
}

3ITS - nasleđivanje

By lanik

3ITS - nasleđivanje

  • 445