You are on page 1of 62

RADNI MATERIJAL

Ovaj materijal NIJE redigovan i zamišljen je samo kao pomod pri


spremanju ispita a nikako kao referentna literatura.
Autori de biti zahvalni ako im se ukaže na sve uočene greške.
.

ПРОГРАМСКИ ЈЕЗИЦИ
Др Милица Вучковић, Нина Турајлић, Марко Петровић
2

RADNI MATERIJAL
Ovaj materijal NIJE redigovan i zamišljen je samo kao pomod pri
spremanju ispita a nikako kao referentna literatura.
Autori de biti zahvalni ako im se ukaže na sve uočene greške.

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


3

Proceduralno programiranje

• Nedostaci:
• svaki podprogram može da pristupi svakom podatku.
• promena u podacima može dovesti do neuspešnog izvršavanja podprograma.
• sa povedanjem veličine programa sve je teže vršiti izmene.

type
tRacun = record
brojRacuna: integer; stanje: real;
end;
var
racun1, racun2: tRacun;
provizija: real;
procedure Uplata(var racun: tRacun; iznos: real);
begin
racun.stanje := racun.stanje + (iznos*(1-provizija));
end;

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


4

Objektno orijentisano programiranje


• U objektno orijentisanom programiranju se polazi od objekata kojima želimo da
manipulišemo, a ne od logike koja je potrebna za tu manipulaciju.

• U realnom sistemu se identifikuju objekti i veze koje postoje između njih.

• Koncepti objektno orijentisanog programiranja:


• učaurenje
• nasleđivanje
• polimorfizam

OBJEKAT = PODACI + METODE

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


5

Apstrakcija
• Selektivno neznanje.
• Ignorisanje detalja

• Predstavlja zanemarivanje nebitnih detalja i usredsređivanje na bitne.

• Pristup “crne kutije” je da postoji mnogo objekata koje možemo da koristimo iako ne
razumemo njihovu unutrašnju strukturu.
• dva objekta mogu imati istu funkciju iako im je unutrašnjost potpuno različita.

• Postoje dve strane svakog objekta


• ono što radi : što je obično poznato
• način na koji radi : koji je obično nepoznat

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


6

OBJEKAT

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


7

Objekat
• Objekat se definiše 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šu:
• identitet
• omogudava razlikovanje objekata među sobom (broj računa)
• ponašanje
• dinamički aspekt objekta (uplata i isplata sa računa, ...)
• definiše se metodama koje sadrži objekat
• stanje
• statički aspekt objekta (broj računa, stanje na računu, vlasnik računa, ...)
• definiše se podacima objekta i njegovim vezama sa drugim objektima u sistemu

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


8

Klasa
• Skup objekata koji imaju zajedničku strukturu i ponašanje.
• Klasa je generička definicija objekta.

• Klasa je struktura podataka koju treba posmatrati kao novi tip.

• Objekat je instanca klase.

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


9

Definisanje klase
• Koristi se ključna reč class iza koje se navodi ime klase, a zatim se unutar vitičastih zagrada
članovi klase.

• Članom klase se podrazumeva bilo koji podatak ili funkcija koji su definisani unutar klase.
• pod funkcijom se podrazumeva bilo koji član koji sadrži kôd:
• metode, svojstva, konstuktori i preklopljeni operatori.

• Redosled navođenja članova klase nije značajan.

public class Racun


{
public void Uplata(decimal iznos){...} funkcije
public void Isplata(decimal iznos){...}
public void Prikazi(){...}
private long brojRacuna; podaci
private decimal stanje;
private decimal provizija;
}

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


10

Instanciranje klase (kreiranje objekta)


• Klasa je referentni tip.
• deklaracijom se ne kreira instanca klase (objekat), ved referenca.

• Instanciranje klase, odnosno kreiranje objekta vrši se iz dva koraka:


• alokacija memorije se vrši pomodu operatora new.
• inicijalizacija objekta se vrši pomodu konstruktora kojim se
• alocirana memorija “pretvara” u objekat i
• objekat inicijalizuje.

• Pristup članovima objekta ostvaruje se navođenjem punog kvalifikovanog imena člana.

Racun racun1; racun1 objekat Racun


racun1 = new Racun(); brojRacuna
11456
0
poziv konstruktora stanje
racun1.brojRacuna = 11456; 0
provizija
puno kvalifikovano ime 0

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


11

Konstruktori
• Specijalne metode koje služe za inicijalizaciju objekata nakon njihovog kreiranja.

• Konstruktor obezbeđuje da objekat ima dobro definisano početno stanje pre nego što se
upotebi. Ako ne uspe inicijalizacija nede postojati objekat.

• Koristi se ime klase (metoda ima isto ime kao i klasa) iza koga slede zagrade.

• Nema povratnu vrednost, pa čak ni tipa void.

• Postoje dve vrste:

• konstruktori instanci
• oni inicijalizuju objekte

• statički konstruktori
• oni inicijalizuju klase

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


12

Podrazumevani (default) konstruktor

• Kada se kreira objekat .NET kompajler, ukoliko nije eksplicitno naveden konstruktor,
automatski generiše podrazumevani konstruktor.

class Datum
{
private int godina, mesec, dan;
// public Datum () { ... } default konstruktor koji se automatski
generiše pošto nije naveden konstruktor
}

class Primer
{
static void Main()
{
Datum danas = new Datum(); kreira se objekat i poziva konstruktor
...
}
}

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


13

Osobine podrazumevanog konstruktora


• Ne prima parametre.

• Implicitno inicijalizuje sva nestatička polja na njihove podrazumevane vrednosti:


• numerička polja (npr. int, double,decimal) na nulu
• logička polja na false
• polja referentnog tipa na null
• polja tipa zapis tako da su svi elementi zapisa inicijlizovani na njihove podrazumevane vrednosti.

• Modifikator pristupa je public

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


14

Reimplementiranje podrazumevanog konstruktora

• Kada reimplementirati?
• ako modifikator pristupa public nije odgovarajudi
• ako inicijalizacija polja na podrazumevane vrednosti nije odgovarajuda.

• PREPORUKA:
• u konstruktoru bi trebalo da se rade samo jednostavne inicijalizacije

public class Datum


{
private int godina, mesec, dan;

public Datum()
{
godina = 2000;
mesec = 1;
dan = 1;
}
}

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


15

Konstruktori

• Konstruktor može primiti jedan ili više parametara koji se koriste za inicijalizaciju polja.

• Ako se u klasi deklariše bar jedan konstruktor, kompajler nede generisati podrazumevani
konstruktor.

public class Datum {


public int godina, mesec, dan;
public Datum (int g, int m, int d){
godina = g;
mesec = m;
dan = d;
}
}
class Primer {
static void Main()
{
Datum danas = new Datum(); //greška
}
}

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


16

Konstruktori

• Sva polja koja nisu inicijalizovana u korisnički definisanom konstruktoru zadržavaju svoju
podrazumevanu inicijalizaciju.
public class Datum
{
public int godina, mesec, dan;
public Datum (int g, int m)
{
godina = g;
mesec = m;
}
}
public class Primer
{
static void Main()
{
Datum danas = new Datum(2010, 3);
Console.WriteLine(danas.godina); // ispisuje 2010
Console.WriteLine(danas.dan); // ispisuje 0
}
}

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


17

Konstruktori

• Za jednu klasu može se definisati više konstruktora


• NAPOMENA: lista parametara svakog od njih mora biti jedinstvena, ili po broju ili po tipu
parametara (odnosno moraju imati različite potpise)
public class Datum
{
public int godina, mesec, dan;

public Datum ()
{
}

public Datum (int g, int m, int d)


{
godina = g;
mesec = m;
dan = d;
}
}

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


18

Konstruktori – Inicijalizatorske liste

• Može se desiti da preklopljeni konstruktori sadrže isti kôd.


• Inicijalizatorska lista omogudava da jedan konstruktor poziva drugi koji je deklarisan
unutar iste klase.
• omogudava da se konstruktor implementira pozivanjem preklopljenog konstruktora.
• SINTAKSA:
• navode se : iza kojih sledi ključna reč this, a u zagradi su navedeni parametri.
• Inicijalizatorske liste se mogu koristiti samo kod konstruktora

public class Datum


{
public int godina, mesec, dan;
public Datum (): this(2010, 3, 30){
}
public Datum (int g, int m, int d){
godina = g;
mesec = m;
dan = d;
}
}

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


19

UČAURENJE

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


20

Učaurenje
• Koncept objektno orijentisanog programiranja.

• Dodatna apstrakcija kojom se “sakrivaju” detalji implementacije objekta.

• Postoje dva bitna aspekta učaurenja:


• objedinjavanje podataka i funkcija u jedinstven entitet (klasa)
• kontrola mogudnosti pristupa članovima entiteta (modifikatori pristupa)

DIREKTAN PRISTUP PODACIMA JE I NEPOŽELJAN I NEPOTREBAN

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


21

Učaurenje
• Objedinjavanje podataka i funkcija u jedinstven entitet
• ostvaruje se pomodu klasa.
• određuju se granice entiteta.

Uplata() Uplata()

stanje stanje

Isplata() Isplata()

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


22

Učaurenje
• Kontrola mogudnosti pristupa članovima entiteta
• ostvaruje se navođenjem modifikatora pristupa (public i private)

• Uvođenjem modifikatora pristupa omogudava se razdvajanje klase na


• javni deo
• čine ga članovi koji su označeni sa modifikatorom pristupa public
• pristup nije ograničen
• privatni deo
• čine ga članovi koji su označeni sa modifikatorom pristupa private
• mogu mu pristupiti samo članovi klase

Uplata() Uplata()

stanje x stanje

Isplata() Isplata()

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


23

Učaurenje
public class Racun
{
public void Uplata(decimal iznos)
{
stanje = stanje + (iznos*(1-provizija));
}
public void Isplata(decimal iznos){...}
public void Prikazi(){...}

public long brojRacuna;


public decimal stanje;
public decimal provizija;
}
...
Racun racun1 = new Racun();
racun1.Uplata(100);
racun1.stanje = 555000; // nije obračunata provizija

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


24

Učaurenje

• PREPORUKA:
• podaci objekta treba da se nalaze u privatnom delu.

public class Racun


{
public void Uplata(decimal iznos)
{
stanje = stanje + (iznos*(1-provizija));
}
public void Isplata(decimal iznos){...}
public void Prikazi(){...}

private long brojRacuna;


private decimal stanje;
private decimal provizija;
}
...
Racun racun1 = new Racun();
racun1.Uplata(100);
racun1.stanje = 555000; // direktan pristup nije dozvoljen

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


25

Učaurenje

Modifikator Opis
public Pristup bez ograničenja.
protected Pristup je mogud iz sklopa u kome je definisan i izvedenih klasa klase u kojoj se
internal nalazi, a koje su van tog sklopa.
internal Pristup je mogud iz sklopa u kome je definisan.
protected Pristup je mogud iz klase u kojoj je definisan i svih izvedenih klasa.
private Pristup je mogud samo iz klase u kojoj je definisan.

• Od mesta deklaracije određenog člana zavisi i vrsta modifikatora pristupa koji se može
koristiti. Ukoliko nije naveden, određuje se podrazumevani modifikator:

• za imenovani prostor nije dozvoljeno navođenje modifikatora, jer se podrazumeva da su javni


• tipovi koji se deklarišu unutar imenovanog prostora mogu biti public ili internal. Podrazumevani
modifikator je internal.
• članovi klase mogu da imaju bilo koji od navedenih pet modifikatora. Podrazumevani je private.
• članovi zapisa mogu biti public, internal ili private. Podrazumevani je private.
• članovi interfejsa ne mogu imati modifikatore pristupa. Implicitno su public.
• članovi nabrajanja ne mogu imati modifikatore pristupa. Implicitno su public.
Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović
26

Učaurenje

• Domen iz koga se može pristupiti određenom tipu nikad ne sme biti uži od domena iz
koga se može pristupiti članu koji je deklarisan unutar tog tipa.

namespace FON.PJ
{
internal class Racun
{
...
public decimal stanje; //greška
}
}

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


27

Zašto učaurivati?
• Postoje dva razloga:

• omogudava se kontrola korišdenja


• Objekat se može koristiti isključivo preko javnih metoda

• omogudava se smanjivanje uticaja promena


• Ukoliko su detalji implementacije objekta privatni mogu se promeniti, a da te promene ne
utiču direktno na korisničke objekte (koje jedino mogu da pristupe javnim metodama)

Uplata() Uplata()

dinara
stanje
para
Isplata() Isplata()

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


28

Učaurenje
public class Racun {
public decimal DajStanje()
{
return stanje;
}
public void Prikazi(){...}
private decimal stanje;
}
public class Komitent {
public void Prikazi()
{
Console.WriteLine( “Komitent ...” );
Console.WriteLine( string.Format(“Stanje: {0}” racun.DajStanje() );
}
private Racun racun;
}

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


29

Učaurenje

• Promena ne utiče na korisnika klase.

public class Racun {


public decimal DajStanje()
{
return (decimal)dinara + (decimal)para / 100;
}
public void Prikazi(){...}
private long dinara;
private long para;
}

public class Komitent {


public void Prikazi()
{
Console.WriteLine( string.Format(“Stanje: {0}”, racun.DajStanje() ) );
}
private Racun racun;
}

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


30

NASLEĐIVANJE

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


31

Nasleđivanje
• Koncept objektno-orijentisanog programiranja.
Bazna klasa
• Omogudava da se na osnovu postojede izvede nova klasa.

• Izvedena klasa nasleđuje sve članove bazne klase. Izvedena klasa

• Nasleđivanjem se ostvaruje veza (odnos) između objekata.


• is veza (“je tipa”)
• bazna (super, nadređena) klasa
• izvedena (podklasa, podređena) klasa koja nasleđuje baznu klasu.

• Treba razlikovati
• nasleđivanje klasa
• nasleđivanje interfejsa
• klasa koja nasleđuje interfejs mora da implementira sve navedene funkcije

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


32

Nasleđivanje
• Nasleđivanje može biti direktno i indirektno.

• Klasa C direktno nasleđuje klasu B, a indirektno klasu A


• Sve promene nad baznom klasom (klasa A) se automatski odražavaju nad izvedenim klasama (klasa
B, klasa C i klasa D). Obrnuto ne važi.

• Jednu baznu klasu može da nasledi više izvedenih klasa


• broj izvedenih klasa za jednu baznu klasu nije ograničen.
• iz klase B su izvedene klasa C i klasa D

klasa A

klasa B

klasa C klasa D

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


33

Jednostruko i višestruko nasleđivanje


• Jednostruko nasleđivanje
• Izvedena klasa direktno nasleđuje jednu baznu klasu.

Bazna klasa

Izvedena klasa

• Višestruko nasleđivanje
• Izvedena klasa direktno nasleđuje dve ili više baznih klasa

Bazna klasa ... Bazna klasa

Izvedena klasa

C# PODRŽAVA SAMO JEDNOSTRUKO NASLEĐIVANJE


Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović
34

Hijerarhija nasleđivanja
• Svaka izvedena klasa može dalje biti bazna klasa.

• Grupa klasa koje su povezane nasleđivanjem formiraju strukturu koja se naziva hijerarhija
klasa.
• klase na višim nivoima su opštije (koncept generalizacije), dok su one na nižim nivoima u hijerarhiji
specifičnije (koncept specijalizacije).

• Dubina hijerarhije – broj nivoa nasleđivanja.


• preporuka je da broj nivoa ne bude vedi od sedam
Klasa A
Generalizacija

Klasa B Klasa C

Klasa C Klasa D Klasa E

Specijalizacija
Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović
35

Sintaksa nasleđivanja
• Ukoliko nije eksplicitno navedena bazna klasa podrazumeva se System.Object

class IzvedenaKlasa: BaznaKlasa


{...}

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


36

Nasleđivanje
• Izvedena klasa nasleđuje sve članove bazne klase osim konstruktora i destruktora.
• javni članovi bazne klase su implicitno javni članovi izvedene klase.

public class Racun


{
public void Uplata(decimal iznos){...}
public void Isplata(decimal iznos){...}
private long brojRacuna;
private decimal stanje;
}
public class TekuciRacun: Racun
{
}
...
TekuciRacun tekuci = new TekuciRacun();
Tekuci.Uplata(100); //pristup nasleđenoj metodi

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


37

Nasleđivanje
• Izvedenoj klasi se mogu dodati novi članovi.

public class Racun


{
public void Uplata(decimal iznos){...}
public void Isplata(decimal iznos){...}
private long brojRacuna;
private decimal stanje;
}
public class TekuciRacun: Racun
{
private decimal provizija; // novi član
}

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


38

Pristup članovima bazne klase


• Nasleđivanje ne podrazumeva da de izvedena klasa imati pristup svim članovima bazne
klase.
• privatni članovi bazne klase, iako nasleđeni, su dostupni isključivo članovima bazne klase.

public class Racun


{
public void Uplata(decimal iznos){...}
public void Isplata(decimal iznos){...}
private long brojRacuna;
private decimal stanje;
}
public class TekuciRacun: Racun
{
public void Prikazi();
{
Console.WriteLine(“Stanje:”, stanje); //greška
}
}

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


39

Pristup članovima bazne klase


• Članovi bazne klase sa modifikatorom protected su jedino dostupni unutar bazne klase i
direktno i indirektno izvedenim klasama.
• u ostalim slučajevima se ponašaju kao da su označeni sa “private”

• PREPORUKA
• sva polja klase treba da imaju modifikator pristupa private, a za svako od njih navesti svojstvo sa
modifikatorom pristupa protected.

public class Racun


{
...
protected decimal stanje;
}
public class TekuciRacun: Racun {
public void Prikazi()
{
Console.WriteLine(“Stanje:”, stanje); // OK
}
}

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


40

Pristup članovima bazne klase


• Metode izvedene klase ne mogu da pristupe članovima bazne klase preko reference.

public class Racun


{
...
protected decimal stanje;
}
public class TekuciRacun: Racun
{
public void Prikazi(Racun racun)
{
Console.WriteLine(“Stanje:”, racun.stanje); // greška
}
}

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


41

Dostupnost izvedenih klasa


• Dostupnost izvedene klase je uslovljena dostupnošdu bazne klase
• ukoliko je bazna klasa privatna, izvedena klasa ne može biti javna.

...
private class Racun
{
...
}
public class TecuciRacun: Racun // greška
{
...
}

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


42

Poziv konstruktora bazne klase


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

• Prvo se izvršava konstruktor bazne klase

• Navođenje inicijalizatora konstruktora nije obavezno


• ukoliko se ne navede, poziva se konstruktor (bez parametara) bazne klase
• konstruktor bazne klase, implicitno poziva konstruktor klase System.Object

public class BaznaKlasa


{
public BaznaKlasa() {...}
}

public class IzvedenaKlasa: BaznaKlasa


{
public IzvedenaKlasa(): base() { ... }
}
inicijalizator konstruktora

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


43

Poziv konstruktora bazne klase


• Greška: poziva se nepostojedi konstruktor bazne klase

public class BaznaKlasa


{
public BaznaKlasa(int x) {...}
}

public class IzvedenaKlasa: BaznaKlasa


{
public IzvedenaKlasa() { ... } //greška
ili
public IzvedenaKlasa(): base() {...} //greška
}

public class IzvedenaKlasa: BaznaKlasa


{
public IzvedenaKlasa(): base(10) {...} //OK
public IzvedenaKlasa(int broj): base(broj) {...} //OK
}

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


44

SKRIVANJE

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


45

Sakrivanje metoda

• Ukoliko se u izvedenoj klasi navede identična metoda (metoda sa istim potpisom) kao i u
baznoj klasi, prijavide se upozorenje o preklapanju u nazivima metoda.
• “FON.PJ.TekuciRacun.Prikazi()' hides inherited member 'FON.PJ.Racun.Prikazi()'. Use the new keyword if hiding was intended.”

namespace FON.PJ
{
public class Racun
{
public void Prikazi(){
Console.WriteLine(string.Format(“Racun: {0}”, brojRacuna));
}
}

public class TekuciRacun: Racun


{
public void Prikazi(){
Console.WriteLine(string,Format(“Tekuci racun: {0}”, brojRacuna));
}
}
}

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


46

Metode sa istim potpisom


• Ova situacija se može razrešiti na sledede načine:

1. promena naziva metode u izvedenoj klasi

2. navođenje ključne reči new ispred metode u izvedenoj klasi


• nasleđena metoda se sakriva novom metodom u izvedenoj klasi

3. navođenje ključne reči virtual ispred metode u baznoj i ključne reči override u izvedenoj klasi
• nasleđena metoda se reimplementira u izvedenoj klasi

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


47

Sakrivanje metoda

• Promena naziva metode u izvedenoj klasi.

public class Racun


{
public void Prikazi(){
Console.WriteLine(string.Format(“Racun: {0}”, brojRacuna));
}
}
public class TekuciRacun: Racun
{
public void PrikaziTekuci(){
Console.WriteLine(string.Format(“Tekuci racun: {0}”, brojRacuna));
}
}
...
TekuciRacun tekuci = new TekuciRacun();
tekuci.Prikazi(); // Racun: 11456
tekuci.PrikaziTekuci(); // Tekuci racun: 11456

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


48

Sakrivanje metoda

• Da bi se sakrila nasleđena metoda bazne klase koristi se ključna reč new.


• uvodi se potpuno nova metoda kojom se zamenjuje nasleđena

• Koja metoda de biti pozvana, metoda bazne ili izvedene klase?


• određuje se na osnovu tipa promenljive, a ne na osnovu tipa same instance

public class Racun {


public void Prikazi() {
Console.WriteLine(“Racun: {0}”, brojRacuna);
}
}
public class TekuciRacun: Racun {
new public void Prikazi() {
Console.WriteLine(“Tekuci racun: {0}”, brojRacuna);
}
}
Racun racun = new Racun();
racun.Prikazi(); // Racun; 11456
TekuciRacun tekuci = new TekuciRacun();
tekuci.Prikazi(); // Tekuci racun: 11456

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


49

POLIMORFIZAM

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


50

Polimorfizam
• Sposobnost promenljive da referencira objekte različitih tipova i da automatski poziva
odgovarajudu metodu objekta koji se referencira se naziva polimorfizam.

• Polimorfizam se zasniva na slededem konceptu:


• metoda koja je deklarisana u baznoj klasi može da se implementira na više različitih načina u
različitim izvedenim klasama.

KOMPATIBILNOST OBJEKTNIH TIPOVA


Promenljiva tipa bazna klasa može da referencira instance direktno ili indirektno izvedenih klasa

OsnovnaKlasa promenljiva = new IzvedenaKlasa();

Polimorfizam se realizuje pomodu


VIRTUELNIH METODA

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


51

Virtuelne metode

• Za deklaraciju virtuelne metode se koristi ključna reč virtual.

• Prilikom definisanja, virtuelne metode se moraju implementirati.

• Privatne i statičke metode se ne mogu definisati kao virtuelne.


public class Racun
{
public virtual void Prikazi() {...}
}
...
public class Racun
{
public virtual void Prikazi(); //greška
}
...
public class Racun
{
private virtual void Prikazi(); //greška
}
Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović
52

Reimplementiranje metoda

• Proces implementacije virtuelne metode u izvedenoj klasi se naziva reimplementacija.

• Koristi ključna reč override.

public class Racun


{
public virtual void Prikazi() {...}
}
public class TekuciRacun: Racun
{
public override void Prikazi() {...}
}

• Kao i virtuelna metoda i reimplementirana metoda mora sadržati kod.


public class TekuciRacun: Racun
{
public override void Prikazi(); //greška
}

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


53

Reimplementiranje metoda

• Virtuelna i reimplementirana metoda moraju biti indetične, moraju imati


• isti naziv,
• isti modifikator pristupa,
• isti tip rezultata i
• iste parametre.

public class Racun


{
public virtual void Prikazi() {...}
}
public class TekuciRacun: Racun
{
public override void Prikazi(string s) {...} //greška
}

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


54

Reimplementiranje metoda

• Koja metoda de biti pozvana, metoda bazne ili izvedene klase?


• određuje se na osnovu tipa instance koju promenljiva referencira, a ne na osnovu tipa same
promenljive.

public class Racun {


public virtual void Prikazi() {
Console.WriteLine(“Racun: {0}”, brojRacuna);
}
}
public class TekuciRacun: Racun {
public override void Prikazi() {
Console.WriteLine(“Tekuci racun: {0}”, brojRacuna);
}
}
Racun racun = new Racun();
racun.Prikazi(); // Racun; 11456
racun = new TekuciRacun();
racun.Prikazi(); // Tekuci racun: 11456

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


55

Reimplementiranje metoda

• Reimplementirana metoda se takođe može reimplementirati


• reimplementirana metoda je implicitno virtuelna i ne može se eksplicitno tako deklarisati.

public class A
{
public virtual void Prikazi() {...}
}
public class B: A
{
public override void Prikazi() {...}
}
public class C: B
{
public override void Prikazi() {...} // OK
public override virtual void ... // Greška
}

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


56

Rano i kasno povezivanje


• Rano povezivanje:
• statičko povezivanje
• poziv metode se razrešava u toku kompajliranja.

• Kasno povezivanje:
• dinamičko povezivanje
• poziv metode se razrešava u toku izvršavanja.

• Kasno povezivanje sa jedne strane povedava fleksibilnost, dok sa druge strane utiče na
performanse.
• potrebno je više vremena za povezivanje
• potrebno je pronadi klasu čija je metoda pozvana.

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


57

Virtuelne metode
• Metode nisu implicitno virtuelne iz slededih razloga:

• performanse
• potrebno je vreme da bi se odredilo (pronašlo) koju od reimplementiranih metoda treba
pozvati, što najčešde ne utiče u velikoj meri na performanse.
• vedi problem je nemogudnost optimizacije koda prilikom kompajliranja. Za nevirtuelne metode
ova informacija je dostupna u vreme kompajliranja, što znači da se prilikom kompajliranja
mogu sprovesti određene optimizacije (npr. inline).

• dizajn
• metode klase koje su namenjene za internu upotrebu i koje se odnose isključivo na dizajn date
klase ne treba da se reimplementiraju u izvedenim klasama, pa samim tim ne treba ni da budu
virtuelne.

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


58

Sakrivanje virtuelnih metoda

• Virtuelne metode se takođe mogu sakriti

• Sakrivanje metoda utiče na polimorfizam

• Nova metoda može biti virtuelna, što znači da se u dalje izvedenim klasama ona može
reimplementirati

public class A
{
public virtual void Ispis() {...}
}
public class B: A
{
public override void Ispis() {...}
}
public class C: B
{
new public void Ispis() {...}
}

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


59

Sakrivanje vs. Reimplementiranje


public class OsnovnaKlasa
{
public void Metoda() {Console.Write(“A”);}
}

public class IzvedenaKlasa: OsnovnaKlasa


{
public new void Metoda() {Console.Write(“B”);}
}

OsnovnaKlasa promenljiva = new IzvedenaKlasa();


promenljiva.Metoda;

• Na ekranu se ispisuje?

• U vreme kompajliranja, na osnovu tipa promenljive, de se odrediti metoda koja se poziva.


• poziva se metoda osnovne klase ... ispisuje se A

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


60

Sakrivanje vs. Reimplementiranje


public class OsnovnaKlasa
{
public virtual void Metoda() {Console.Write(“A”);}
}

public class IzvedenaKlasa: OsnovnaKlasa


{
public override void Metoda() {Console.Write(“B”);}
}

OsnovnaKlasa promenljiva = new IzvedenaKlasa();


promenljiva.Metoda;

• Na ekranu se ispisuje?

• Generisade se kod kojim de se proveriti tip instance koju referencira promenljiva, u ovom
slučaju izvedena klasa
• poziva se reimplementirana metoda ... ispisuje se B

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


61

Sakrivanje vs. Reimplementiranje


public class OsnovnaKlasa
{
public virtual void Metoda() {Console.Write(“A”);}
}

public class IzvedenaKlasa: OsnovnaKlasa


{
}

OsnovnaKlasa promenljiva = new IzvedenaKlasa();


promenljiva.Metoda;

• Na ekranu se ispisuje?

• Generisade se kod kojim de se proveriti tip instance koju referencira promenljiva, u ovom
slučaju izvedena klasa
• poziva se nasleđena metoda obzirom da nije reimplementirana ... ispisuje se A

Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović


62

Sakrivanje virtuelnih metoda


public class A {
public virtual void Ispis() { Console.Write(“A”); }
}
public class B: A {
public override void Ispis() { Console.Write(“B”); }
}
public class C: B {
new public virtual void Ispis() { Console.Write(“C”); }
}
public class D: C {
public override void Ispis() { Console.Write(“D”); }
}
...
D d = new D(); C c = d; B b = c; A a = b;
d.Ispis(); c.Ispis(); b.Ispis(); a.Ispis();

• Na ekranu se ispisuje?

DDBB
Programski jezici © 2009/2010 M. Vučković, N. Turajlić, M. Petrović

You might also like