200 likes | 333 Views
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).
E N D
Računarski praktikum 3Vjež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)
Primjer nasljeđivanja 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; } } • konstruktori se ne nasljeđuju. ako nemamo defaultni konstruktor, moramo ga pozvati eksplicitno
Polimorfizam public 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(); } }
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(); } }
Zadatak 1 • U prethodnom primjeru uklonite riječ virtual, te objasnit što se događa
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(); } }
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( … )
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
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 …
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
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
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 int i=5; // na stogu object o = i; // boxani i je sada na heapu int j = (int)o; Console.WriteLine(“j: {0}”, j);
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 class VanjskaKlasa { … public class UgnijezdjenaKlasa { … } VanjskaKlasa.UgnijezdjenaKlasa
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
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
Strukture • struktura je vrijednosti tip • može imati konstruktore, 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 [modifikator pristupa] structidentifikator [: popis sučelja] { // tijelo klase: definicija svojstava, metoda i događaja }
Strukture public struct Lokacija { private int xVrijednost; private int yVrijednost; // konstruktor public 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(); } }
Strukture class 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 Lokacija Lokacija l1 = new Lokacija(100, 200);// ili Lokacija l1; l1.xVrijednost=100; l1.yVrijednost=200; - moraju biti svi elementi Console.WriteLine("Lokacija prije poziva TestFunkcije: {0}", l1); // poziv testFunkcije TestFunkcija(l1); Console.WriteLine("Lokacija nakon poziva TestFunkcije: {0}", l1); } }
Zadatak 6 • U prethodnom primjeru pokušajte struct zamijeniti sa class