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
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
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;}
}
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") {}
}
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();
}}
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();
}}
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"); }
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(); }
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
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);
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 { … }
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 (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}
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();}
}
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);}
}
Zadatak 6
U prethodnom primjeru pokušajte struct zamijeniti sa class