Da ponovimo osnovno o klasama:

Klasa je skup objekata koji imaju zajedničku strukturu i ponašanje. Predstavlja strukturu podataka koju treba posmatrati kao novi tip.
Objekat je instanca klase (konkretan primerak klase) i definiše se kao entitet koji je sposoban da čuva svoja stanja i koji okolini stavlja na raspolagaje skup operacija preko kojih se tim stanjima pristupa.

Objekat karakteriše njegov:
--> IDENTITET - razlikovanje objekata među sobom,
--> PONAŠANJE - dato preko skupa metoda koje sadrži objekat
--> STANJE - varijable (promenljive) vezane za objekat

//podvucimo još jednom da se stanja odnose na varijable, a ponašanje na metode

Direktan pristup podacima je nepotreban i nepoželjan  -->podatke treba "začauriti" (enkapsulirati)!
Postoje dva bitna aspekta enkapsulacije:
1.
objedinjavanje podataka i funkcija u jedinstven entitet (preko klasa) ,
2.
kontrola mogućnosti pristupa članovima entiteta (preko modifikatora pristupa).

Enkapsulacija omogućava kontrolu korišćenja objekta (objekat se može koristiti isključivo preko javnih metoda/svojstava).

Instanciranje klasa  --> vrši se pomoću opreatora new:

      Primer ->       Amf argus = new Amf();
Konstruktor je specijalna metoda koja:
- ima isti naziv kao i naziv klase,
- nema nikakvu povratnu vrednost.

 Operator new vrši alokaciju memorije za objekat klase Amf, a metoda (konstruktor) Amf() kreira objekat.

Šta je ključna reč this?
--> upotrebom ključne reči this, implicitno se pokazuje na tekući objekat/parametar
(kod statičkih metoda se ne prosleđuje ovaj dodatni parametar, jer se ne pozivaju pomoću objekata)


Nasleđivanje predstavlja mogućnost da se jedna klasa definiše na osnovu druge klase pri čemu će ta nova klasa imati sve osobine koje ima i postojeća klasa, neke će biti promenjene, a neke nove će biti dodate.

Klasa na osnovu koje kreiramo novu klasu zove se osnovna (base), a klasa koju kreiramo se zove izvedena (derived).

public class Osnovna
{
...
}
public class Izvedena : Osnovna
{
...
}

Objekti izvedene klase nasleđuju sve članove koji čine osnovnu klasu. Prilikom kreiranja objekta izvedene klase, poziva se konstruktor te klase, ali i konstruktor osnovne klase.

- Nasleđivanje klasa može biti DIREKTNO i INDEREKTNO.
       ( Indirektno, svaka klasa nasleđuje klasu Object. )
- Jednu baznu klasu može da nasledi više izvedenih klasa (broj izvedenih klasa je neograničen).

Izvedena klasa nasleđuje sve osim konstruktora i destruktora bazne klase !

Ukoliko nije eksplicitno navedena bazna klasa podrazumeva se klasa System.Object.

––> javni članovi bazne klase su implicitno i javni članovi izvedene klase.

Nasleđivanje ne može da se koristi kod struktura. Odnosno ne može da se napravi struktura koja je izvedena iz neke klase ili druge strukture.

Ukoliko osnovna i izvedena klasa imaju metode sa istim imenom, prilikom kompajliranja aplikacije javlja se upozorenje. Da bi se izbegla (isključila) upozorenja uglavnom se ispred modifikatora pristupa metode stavlja ključna reč new.

Primer:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication
{
    class Tacka
    {
        private double x;
        private double y;
 
        public Tacka()
        {
            x = 0;
            y = 0;
        }
 
        public Tacka(double x, double y)
        {
            this.x = x;
            this.y = y;
        }
 
        public void PrikazKoordinata()
        {
            Console.WriteLine("Koordinate tacke: " + x + ", " + y);
        }
 
        public double UdaljenostOdKorPoc()
        {
            return Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2));
        }
    }
 
    class Krug : Tacka
    {
        private double r;
 
        public Krug() : base()
        {
            r = 0;
        }
 
        public Krug(double x, double y, double r) : base(x, y)
        {
            this.r = r;
        }
 
        public double Povrsina()
        {
            return Math.Pow(r, 2) * Math.PI;
        }
 
        public double Obim()
        {
            return 2 * r * Math.PI;
        }
    }
 
    class Valjak : Krug
    {
        private double h;
 
        public Valjak() : base()
        {
            h = 0;
        }
 
        public Valjak(double x, double y, double r, double h) : base(x, y, r)
        {
            this.h = h;
        }
 
        new public double Povrsina()
        {
            return 2 * base.Povrsina() + base.Obim() * h;
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Tacka T1 = new Tacka();
            Tacka T2 = new Tacka(2, -6);
            T1.PrikazKoordinata();
            T2.PrikazKoordinata();
            Console.WriteLine("Udaljenost T2 od koordinatnog pocetka: " + T2.UdaljenostOdKorPoc());
 
            Krug K1 = new Krug(5, 5, 5);
            Console.WriteLine("Udaljenost centra K1 od koordinatnog pocetka: " + K1.UdaljenostOdKorPoc());
            Console.WriteLine("Povrsina K1: " + K1.Povrsina());
            Console.WriteLine("Obim K1: " + K1.Obim());
 
            Valjak V1 = new Valjak(4, 4, 4, 4);
            Console.WriteLine("Povrsina V1: " + V1.Povrsina());
        }
    }
}


- Izvedenoj klasi se, naravno, mogu dodati novi članovi.

- Nasleđivanje ne podrazumeva da će izvedena klasa imati pristup svim članovima bazne klase.
––> privatni članovi bazne klase, iako nasleđeni, su dostupni isključivo članovima bazne klase 

––> članovi bazne klase sa modifikatorom protected su jedino dostupni unutar bazne klase i direktno i indirektno izvedenim klasama.

PODSETIMO SE: ukoliko modifikator pristupa nije naveden podrazumeva se da su članovi klase označeni sa "private".

Preporuka:
––> sva polja klase treba da imaju modifikator pristupa private, a za svako polje treba navesti svojstvo sa modifikatorom pristupa protected.


Dostupnost izvedene klase je uslovljena dostupnošću bazne klase
––> ukoliko je bazna klasa privatna, izvedena klasa ne može biti javna!


Za poziv konstuktora bazne klase iz konstruktora izvedene klase se koristi ključna reč base.

  1. public class BaznaKlasa
  2. {
  3.   public BaznaKlasa() {...}
  4. }
  5.  
  6. public class IzvedenaKlasa: BaznaKlasa
  7. {
  8.   public IzvedenaKlasa(): base() { ... }
  9. }
// prvo se izvršava konstruktor bazne klase.


Last modified: Monday, 25 January 2021, 10:12 AM