23
Računarski praktikum 3 Vježbe 03 Vinko Petričević Nasljeđivanje, polimorfizam, strukture

Računarski praktikum 3 Vježbe 03

  • Upload
    teresa

  • View
    46

  • Download
    5

Embed Size (px)

DESCRIPTION

Računarski praktikum 3 Vježbe 03. Vinko Petričević. Nasljeđivanje, polimorfizam, strukture. Nasljeđivanje. Jedna od glavnih prednosti klasa je nasljeđivanje Specijalizacija opće klase (bazne) generalizacija specijaliziranih klasa kojima pristupano kao općima (polimorfizam). - PowerPoint PPT Presentation

Citation preview

Page 1: Računarski praktikum 3 Vježbe 03

Računarski praktikum 3Vježbe 03

Vinko Petričević

Nasljeđivanje, polimorfizam,

strukture

Page 2: Računarski praktikum 3 Vježbe 03

Nasljeđivanje

Jedna od glavnih prednosti klasa je nasljeđivanje

Specijalizacija opće klase (bazne) generalizacija specijaliziranih klasa kojima

pristupano kao općima (polimorfizam)

Page 3: Računarski praktikum 3 Vježbe 03

Primjer nasljeđivanja

konstruktori se ne nasljeđuju. ako nemamo defaultni konstruktor, moramo ga pozvati eksplicitno

public class Osoba { protected string Ime, Prezime;

public Osoba(string ime, string prezime) { Ime = ime; Prezime = prezime; }}public class Student : Osoba {

public string JMBAG;

public Student(string ime, string prezime, string jmbag) : base(ime, prezime) {

JMBAG = jmbag;}

}

Page 4: Računarski praktikum 3 Vježbe 03

Primjer nasljeđivanja

ako iz jednog konstruktora želimo pozvati drugi, možemo, a rade i defaultni parametri

public class Osoba { protected string Ime, Prezime;

public Osoba(string ime, string prezime) { Ime = ime; Prezime = prezime; }}public class Student : Osoba {

public string JMBAG;

public Student(string ime, string prezime, string jmbag) : base(ime, prezime) { JMBAG = jmbag; }

public Student (string ime="neko") : this (ime, "prezime", "0123456789") {}

}

Page 5: Računarski praktikum 3 Vježbe 03

Polimorfizampublic class Osoba {

…public virtual void Ispisi() {

Console.WriteLine(“Ime: {0}, Prezime: {1}”, ime, prezime);}

}public class Student : Osoba {

…public override void Ispisi() {

Console.WriteLine(“Ime: {0}, Prezime: {1}, JMBAG: {2}”, ime, prezime, JMBAG);

}}public class Profesor : Osoba {

…public override void Ispisi() {

Console.Write(“prof. ”);base.Ispisi();

}}

Page 6: Računarski praktikum 3 Vježbe 03

Polimorfizam class Program { static void Main(string[] args) { Osoba o = new Osoba("Ivana", "Ivanić"); Student s = new Student("Marko", "Marković", "2123123"); Profesor p = new Profesor("Jozo", "Jozić");

o.Detalji(); s.Detalji(); p.Detalji();

Osoba[] poljeOsoba = new Osoba[3]; poljeOsoba[0] = new Osoba("Ivana", "Ivanić"); poljeOsoba[1] = new Student("Marko", "Marković", "3434"); poljeOsoba[2] = new Profesor("Jozo", "Jozić");

for (int i = 0; i < poljeOsoba.Length; i++) poljeOsoba[i].Detalji(); } }

Page 7: Računarski praktikum 3 Vježbe 03

Zadatak 1

U prethodnom primjeru uklonite riječ virtual, te objasnit što se događa

Page 8: Računarski praktikum 3 Vježbe 03

override, new

ako ne premostimo (override) neku virtualnu metodu, kompajler će nam dati upozorenje

ako ne želimo dobiti to upozorenje, trebamo metodu navesti sa new

public class Profesor : Osoba {…public new void Ispisi() {

Console.Write(“prof. ”);base.Ispisi();

}}

Page 9: Računarski praktikum 3 Vježbe 03

Redoslijed izdršavanja konstruktora

za razliku od C++a, prvo se inicijaliziraju svi elementi počevši od najizvedenije klase, pa se onda izvršava sam kôd konstruktora počevši od bazne klase

ovdje bi ispis bio Xb, Xa, A, Bstr.

public class X { public X(string s = "") { Console.WriteLine("X" + s); } }public class A { X xa = new X("a"); public A(string s = "") { Console.WriteLine("A" + s); } }public class B : A { X xb = new X("b"); public B(string s = "") { Console.WriteLine("B" + s); } } static void Main(string[] args) { B b = new B("str"); }

Page 10: Računarski praktikum 3 Vježbe 03

Virtualne funkcije u konstruktoru

za razliku od C++a, virtualne funkcije se pozivaju baš od stvarne klase (dakle ovdje bi ispis bio B).public class A { public A() { IspisiMe(); } public virtual void IspisiMe() { Console.WriteLine("A"); } }public class B : A { public override void IspisiMe() { Console.WriteLine("B"); } } static void Main(string[] args) { B b = new B(); }

Page 11: Računarski praktikum 3 Vježbe 03

Apstraktne klase

ako želimo da izvedena klasa mora implementirati svoju verziju neke metode, u baznoj klasi ju navedemo kao apstraktnu prije deklaracije

apstraktna metoda nema implementaciju apstraktna metoda učini cijelu klasu apstraktnom, pa

prije definicije klase moramo navesti da je apstraktna

iz apstraktne klase se ne mogu stvarati novi objekti, nego moramo koristiti neku konkretnu klasu

abstract public void Ispisi();

abstract public class Osoba { …

Osoba o = new Student( … )

Page 12: Računarski praktikum 3 Vježbe 03

Zadatak 2

Napišite apstraktnu klasu lik koja računa površinu i opseg i može ispisati o kojem liku je riječ

napišite klase pravokutniTrokut, kvadrat, pravokutnik, romb i krug

napišite main koji demonstrira rad s tim klasama

Page 13: Računarski praktikum 3 Vježbe 03

Zapečaćena (sealed) klasa

zapečaćena klasa ne dopušta da se iz nje nasljeđuje (dakle suprotno apstraktnom)sealed public class Student …

Page 14: Računarski praktikum 3 Vježbe 03

Korijen svijh klasa - Object

sve klase su zapravo naslijeđene iz klase System.Object Object ima neke virtualne metode:

Equals() – procjenjuje jesu li dva objekta jednaka GetHashCode() – dopušta objektima da pruže vlastitu

metodu za upotrebu u kolekcijama GetType() – omogućava pristup objektu tipa MemberwiseColne() – stvara kopije objekata; naš tip je

nikad ne bi smio implementirati ReferenceEquals() – procjenjuje pokazuju li dva objekta na

istu instancu ToString() – omogućava predstavljanje objekta nizom

znakova

Page 15: Računarski praktikum 3 Vježbe 03

Zadatak 3

U prethodnom primjeru sa osobom, dodajte metodu koja omogućuje ispis podataka pomoću Console.Write

promotrite što se događa ako ništa ne napravimo

Page 16: Računarski praktikum 3 Vježbe 03

Boxing i unboxing omogućuje tretiranje tipova kao da su referentni pakiranje je implicitno

prilikom raspakiravanja, moramo eksplicitno navesti kastanje

u posljednjoj naredbi se ponovo j prvo zapakirao u object, pa poslao kao parametar funkciji

sada možemo kreirati Osobu:

int i=5; // na stoguobject o = i; // boxani i je sada na heapu

int j = (int)o;

Console.WriteLine(“j: {0}”, j);

Page 17: Računarski praktikum 3 Vježbe 03

Ugniježđene (nested) klase

kao element klase moemo navesti i cijelu novu klasu

ako je vidljiva izvana (deklarirana kao public), njezino ime je

ona vidi sve elemente (i privatne) vanjske klase

VanjskaKlasa.UgnijezdjenaKlasa

class VanjskaKlasa { … public class UgnijezdjenaKlasa { … }

Page 18: Računarski praktikum 3 Vježbe 03

Zadatak 4

Napišite klasu polje koja može pamtiti do 100 objekata

napišite podklasu iterator koja omogućava prolazak kroz sve elemente kolekcije

Page 19: Računarski praktikum 3 Vježbe 03

Zadatak 5

Napišite klasu stog koja predstavlja stog do 100 objekata, s metodama dodaj, skini i gornji

napišite podklasu ispisiStog s metodom ispisi koja ispisuje sve elemente stoga (pri tom kreirajuci novi stog). početni stog na kraju treba ostati nepromijenjen

Page 20: Računarski praktikum 3 Vježbe 03

Strukture struktura je vrijednosti tip

može imati konstruktore (osim defaultnog), svojstva, metode, varijable, operatore, ugniježđene tipove, indeksere

ne podržavaju nasljeđivanje nema inicijalizatora eksplicitni konstruktor mora inicijalizirati sve varijable objekte možemo definirati i bez poziva new (ali onda moramo

sve elemente ručno inicijalizirati) za razliku od C++, defaultni elementi su private

[modifikator pristupa] struct identifikator [: popis sučelja]{

// tijelo klase: definicija svojstava, metoda i događaja}

Page 21: Računarski praktikum 3 Vježbe 03

Strukturepublic struct Lokacija {

private int xVrijednost;private int yVrijednost;

  // konstruktorpublic Lokacija(int xKoordinata, int yKoordinata){

this.xVrijednost = xKoordinata;this.yVrijednost = yKoordinata;

}  public int X

{get { return xVrijednost; }set { xVrijednost = value; }

}public int Y{

get { return yVrijednost; }set { yVrijednost = value; }

}  public override string ToString()

{return this.xVrijednost.ToString() + ", "

+ this.yVrijednost.ToString();}

}

Page 22: Računarski praktikum 3 Vježbe 03

Struktureclass Program{

static void TestFunkcija(Lokacija l){

l.X = 300;l.Y = 400;Console.WriteLine("Lokacija u TestFunkciji: {0}", l);

}static void Main(string[] args){

// stvaranje nove instance strukture LokacijaLokacija l1 = new Lokacija(100, 200);

// ili Lokacija l1; l1.xVrijednost=100; l1.yVrijednost=200; - moraju biti svi elementiConsole.WriteLine("Lokacija prije poziva

TestFunkcije: {0}", l1); 

// poziv testFunkcijeTestFunkcija(l1);Console.WriteLine("Lokacija nakon poziva

TestFunkcije: {0}", l1);}

}

Page 23: Računarski praktikum 3 Vježbe 03

Zadatak 6

U prethodnom primjeru pokušajte struct zamijeniti sa class