objektumorientált programozás c# nyelven...

73
Objektumorientált programozás C# nyelven II. Öröklés és többalakúság Nemvirtuális metódusok, elrejtés Virtuális metódusok, elrejtés Típuskényszerítés, az „is” és „as” operátorok Absztrakt osztályok, absztrakt metódusok Lezárt osztályok, lezárt metódusok Készítette: Miklós Árpád Dr. Kotsis Domokos

Upload: others

Post on 22-Jul-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

Objektumorientált programozás C# nyelven II.

Öröklés és többalakúságNemvirtuális metódusok, elrejtésVirtuális metódusok, elrejtés

Típuskényszerítés, az „is” és „as” operátorokAbsztrakt osztályok, absztrakt metódusok

Lezárt osztályok, lezárt metódusok

Készítette:Miklós ÁrpádDr. Kotsis Domokos

Page 2: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 2

A jelen bemutatóban található adatok, tudnivalók és információk a számonkérendı anyag vázlatát képezik. Ismeretük szükséges, de nem elégséges feltétele a sikeres zárthelyinek, illetve vizsgának. Sikeres zárthelyihez, illetve vizsgához a jelen bemutatótartalmán felül a kötelezı irodalomként megjelölt anyag, a gyakorlatokon szóban, illetve a táblán átadott tudnivalók ismerete, valamint a gyakorlatokon megoldott példák és az otthoni feldolgozás céljából kiadott feladatok önálló megoldásának képessége is szükséges.

Hallgatói tájékoztató

Page 3: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 3

Öröklés (1)• Az osztályokból létrehozhatunk leszármazott osztályokat,

amelyek öröklik az ısosztály összes tagját– Az örökölt metódusok a leszármazottakban módosíthatók– A leszármazottak új tagokkal (mezıkkel, metódusokkal) bıvíthetik az

ısosztálytól örökölt tagok halmazát

• Minden leszármazott osztálynak csak egy ıse lehet• Minden osztály közös ıse a System.Object osztály

class Object{

public Object() {…}public Type GetType() {…}protected object MemberwiseClone() {…}public static bool ReferenceEquals(object objA, object objB) {…}public static bool Equals(object objA, object objB) {…}public virtual bool Equals(object obj) {…}public virtual int GetHashCode() {…}public virtual string ToString() {…}

}

Page 4: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 4

Öröklés (2)• A leszármazott osztályok deklarációjánál „ : ” karakterrel

elválasztva meg kell adnunk az ısosztály nevét is– Ez nem kötelezı abban az esetben, ha az ısosztály a System.Object

class Állat{

int lábszám;public Állat() {…}public void Fut() {…}

}

class Emlıs: Állat{

public bool KicsinyétEteti() {…}}

class Kutya: Emlıs{

public void FarkátCsóválja() {…}public void Ugat() {…}

}

Állat

Emlıs

Kutya

Page 5: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 5

Öröklés (3)• A konstruktorok nem öröklıdnek

– Ha az ısosztályban van paraméter nélküli konstruktor, az a leszármazott osztály konstruktorában automatikusan meghívódik• Ez egyaránt igaz az automatikusan generált alapértelmezett konstruktorra és a

saját, paraméter nélküli konstruktorra

– Ha az ısosztályban nincs paraméter nélküli konstruktor, az ısosztály konstruktorát meg kell hívni a leszármazott osztály konstruktorából• Erre a célra a base kulcsszó áll rendelkezésre

class A{}

class B: A{

public B(int x){… }

}

class A{

public A(){…}

}

class B: A{

public B(int x){…}

}

class A{

public A(int x){…}

}

class B: A{

public B(int x){…}

}

class A{

public A(int x){…}

}

class B: A{

public B(int x): base(x){…}

}

���� ���� ��������

Itt automatikusan létrejön egy paraméter nélküli konstruktor

Kézzel megadott paraméter nélküli

konstruktor

Hivatkozás az ıs konstruktorára

Hibás program

Page 6: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 6

Nemvirtuális metódusok• A nemvirtuális metódusok változatlanul örökölhetık vagy a

leszármazottakban elrejthetık– Statikus (fordítási idejő vagy „korai”) kötés jellemzi ıket

• A saját osztályuknak megfelelı típusú változókon keresztül hívhatók• Fordítási idıben dıl el, hogy az ıket (adott típusú változókon keresztül) felhasználó

programkód melyik osztályhoz tartozó nemvirtuális metódust hívja

– Alapértelmezésben minden metódus nemvirtuális

• Nem igényelnek semmilyen külön szintaktikai megjelölést• Elrejtés: a leszármazott osztályban azonos néven létrehozunk

egy másik metódust– A leszármazott osztályban célszerő az újonnan bevezetett metódust a

new kulcsszóval megjelölni • Bár ez nem kötelezı, ha nem tesszük meg, a C# fordító figyelmeztet rá

– Az ısosztály azonos nevő metódusa a leszármazottban is elérhetı a base kulcsszó segítségével

Page 7: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 7

Nemvirtuális metódusok (példa)using System;class Állat{

public void Fut(){

Console.WriteLine("Az állat így fut.");}

}class Kutya: Állat{

new public void Fut(){

Console.WriteLine("A kutya így fut.");}

}class Macska: Állat{

new public void Fut(){

Console.WriteLine("A macska így fut.");}

}

Page 8: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 8

Nemvirtuális metódusok (példa)class NemvirtuálisMetódusok{

static void Main(){

Állat egyikállat = new Állat();Kutya másikállat = new Kutya();egyikállat.Fut(); // Az Állat osztály Fut() metódusa hívódik megmásikállat.Fut(); // A Kutya osztály Fut() metódusa hívódik megConsole.ReadLine();

Állat házikedvenc;házikedvenc = new Macska();házikedvenc.Fut();házikedvenc = new Kutya();házikedvenc.Fut();

}}

// Az // Az // Az // Az ÁÁÁÁllat osztllat osztllat osztllat osztáááály Fut() metly Fut() metly Fut() metly Fut() metóóóódusa hdusa hdusa hdusa híííívvvvóóóódik meg (!)dik meg (!)dik meg (!)dik meg (!)

// // // // …………éééés isms isms isms isméééét az t az t az t az ÁÁÁÁllat osztllat osztllat osztllat osztáááály Fut() metly Fut() metly Fut() metly Fut() metóóóódusa hdusa hdusa hdusa híííívvvvóóóódik meg dik meg dik meg dik meg ����

Page 9: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 9

Virtuális metódusok• A virtuális metódusok a leszármazottakban módosíthatók

(„felülbírálhatók”) vagy elrejthetık– Dinamikus (futási idejő vagy más szóval „késıi”) kötés jellemzi ıket

• Segítségükkel valódi többalakúság valósítható meg• Saját vagy bármely ısosztályuknak megfelelı típusú változókon keresztül hívhatók• Futási idıben, az adott változó típusától függıen dıl el, hogy az ıket felhasználó

programkód melyik osztályhoz tartozó virtuális metódust hívja– Hívási szabály: egy adott virtuális metódusból mindig a változó által ténylegesen hivatkozott osztályhoz

legközelebb álló változatot hívja meg a program; a legtöbb esetben ez az osztály saját metódusváltozata

• Külön szintaktikai megjelölések tartoznak hozzájuk– A virtuális metódusokat az ısosztályban a virtual kulcsszóval kell

megjelölnünk– A leszármazottakban felülbírált virtuális metódusokat az override

kulcsszóval kell megjelölnünk

• Elrejtés: mint a nemvirtuális metódusok esetén– Ha a leszármazottban azonos néven létrehozott új metódus szintén

virtuális, akkor ezzel új virtuális hívási láncot hozhatunk létre

Page 10: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 10

Virtuális metódusok (példa)using System;class Állat{

public virtual void Fut(){

Console.WriteLine("Az állat így fut.");}

}class Kutya: Állat{

public override void Fut(){

Console.WriteLine("A kutya így fut.");}

}class Macska: Állat{

public override void Fut(){

Console.WriteLine("A macska így fut.");}

}. . .

Page 11: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 11

Virtuális metódusok (példa)class VirtuálisMetódusok{

static void Main(){

Állat házikedvenc;házikedvenc = new Macska();házikedvenc.Fut(); házikedvenc = new Kutya();házikedvenc.Fut();

}}

. . .

Page 12: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 12

Virtuális hívási láncok (példa)using System;

class Állat{

public virtual void MiVagyokÉn() { Console.WriteLine("Állat"); }}

class Kutya: Állat{

public override void MiVagyokÉn() { Console.WriteLine("Kutya"); }}

class Terelıkutya: Kutya{

public new virtual void MiVagyokÉn() { Console.WriteLine("Terelıkutya"); }}

class Puli: Terelıkutya{

public override void MiVagyokÉn() { Console.WriteLine("Puli"); }}

. . .

Page 13: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 13

Virtuális hívási láncok (példa)class VirtuálisHívásiLáncok{

static void Main(){

Puli loncsoska = new Puli();Terelıkutya t = loncsoska;Kutya k = loncsoska;Állat á = loncsoska;

á.MiVagyokÉn();k.MiVagyokÉn();t.MiVagyokÉn();loncsoska.MiVagyokÉn();

}}

. . .

Page 14: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 14

Típuskényszerítés• Típuskényszerítésnél („casting”) egy adott típusú objektumot

úgy kezelünk, mintha egy másik típusba tartozna– Implicit típuskényszerítés: a típusok átalakítása automatikus

• Példa: egész számok átalakítása valós számmá

– Explicit típuskényszerítés: átalakítás a programozó kérésére• Módja: az átalakítandó típus elé, „ ( ) ” karakterek közé kiírjuk a kívánt céltípust

– Késıbb részletesebben tárgyaljuk

Állat Cirmos = new Macska();Állat amıba = new Állat();Macska Lukrécia;Kutya Bodri;

Lukrécia = (Macska) Cirmos;

Bodri = (Kutya) Lukrécia;

Lukrécia = (Macska) amıba;

Implicit típusátalakítás(„Állat” helyén mindig szerepelhet „Macska”)

Explicit típusátalakítás a programozó kérésére (helyesen, mert errıl az „Állat”-ról biztosan

tudjuk, hogy „Macska”)

Fordítási hiba: a „Macska” típus nem alakítható át a „Kutya” típusra

Futási idejő hiba: „Macska” helyén nem szerepelhet „Állat”

Page 15: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 15

Az is és as operátorok• Az is operátor segítségével ellenırizhetı, hogy egy objektum

egy adott osztályhoz vagy leszármazottjához tartozik-e– Ez az ellenırzı kifejezés logikai típusú értéket ad vissza

• Az as operátor segítségével explicit típusátalakítást hajthatunk végre futási idejő hiba veszélye nélkül– Ha az átalakítás nem sikerül, a kifejezés értéke null lesz

class Állatfarm{

Állat Cirmos = new Macska();Állat amıba = new Állat();Macska Lukrécia;Kutya Bodri;Lukrécia = Cirmos as Macska;if (amıba is Kutya)

Bodri = amıba as Kutya;Lukrécia = amıba as Macska;

}A típusátalakítás nem fog sikerülni

(„Macska” helyén nem szerepelhet „Állat”)

A típusátalakítás sikerülni fog (Cirmos értéke „Macska” típusú)

A típusátalakításra nem kerül sor, mert amıba értéke nem „Kutya” típusú, így már a feltétel sem teljesül

Page 16: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 16

Absztrakt osztályok és metódusok• Az absztrakt metódusok nem tartalmaznak megvalósítást• Egy osztály akkor absztrakt, ha tartalmaz legalább egy

absztrakt metódust• Az absztrakt osztályok nem példányosíthatók

– Absztrakt metódusaikat leszármazottaik kötelesek felülbírálni, azaz megvalósítást készíteni hozzájuk

– Az absztrakt metódusok mindig virtuálisak (ezt nem kell külön jelölnünk)

• Az absztrakt osztályok garantálják, hogy leszármazottaik tartalmazni fognak bizonyos funkciókat

• Az absztrakt metódusokat és osztályok az abstract kulcsszóval kell megjelölnünk

Page 17: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 17

Absztrakt osztályok (példa)abstract class Alakzat{

public abstract void Kirajzol();}

class Ellipszis: Alakzat{

public override void Kirajzol(){

// Kirajzol() metódus az Ellipszis osztály megvalósításában}

}

class Kör: Ellipszis{

public override void Kirajzol();{

// Kirajzol() metódus a Kör osztály megvalósításában}

}

Ebbıl az osztályból példányt nem hozhatunk létre, leszármazottai viszont biztosan tartalmaznak egy

megvalósított Kirajzol() nevő metódust

Page 18: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 18

Lezárt osztályok és metódusok• Lezárt osztályból nem származtatható másik osztály• Lezárt metódus leszármazottakban nem bírálható felül

– Metódusok lezárásának csak felülbírált, eredetileg valamelyik ıs által definiált virtuális metódusoknál van értelme

• A lezárt osztályok és lezárt metódusok célja az öröklés megakadályozása– Lehetséges indokai:

• Elıre nem látható célú felhasználás (és a vele járó karbantartási, illetve támogatási problémák) elkerülése

• Teljesítmény optimalizálása– Csak osztályszintő tagokat tartalmazó osztályok– Biztosra vehetı, hogy nem lesznek leszármazottak, így a virtuális metódusok nemvirtuálisra cserélhetık

• Szerzıi jogok védelme

• A lezárt osztályokat és metódusokat a sealed kulcsszóval kell megjelölnünk– Erıs korlátozást jelentenek a fejlesztés során

Page 19: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 19

Feladat: nemvirtuális metódusok

Készítsen Oktató osztályt, melynek az örökösök által is elérhetıadattételei: „kernév” és „veznév” stringek, melyeket a kostruktortölt fel! Az osztály tartalmazzon egy „névki” nevő nyilvános eljárást, mely a teljes nevet a képernyıre írja!Készítse el az Oktató osztály örökösét a Fıállású osztályt! Ez tartalmazzon egy nyilvános elıjel nélküli short adattételt „alkév”néven! Az újra definiált „névki metódus ennek értékét is írja ki a képernyıre!

Page 20: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 20

Oktató osztály

class Oktató{protected string veznév, kernév;public Oktató(string vn, string kn){veznév = vn;kernév = kn;}public void névki(){Console.WriteLine(veznév+" "+kernév);

}}

Page 21: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 21

Fıállású

class Fıállású:Oktató{public ushort alkév;public Fıállású(string vn, string kn): base(vn,kn){}public Fıállású(string vn, string kn, ushort aé): base(vn,kn){alkév = aé;

}public new void névki(){Console.WriteLine(veznév + " " + kernév+" "+alkév);

}}

Page 22: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 22

Fıprogram: melyik sor hibás?class Próba{public static void Main(){Fıállású Józsi = new Fıállású("Nagy", "József", 2005);Oktató Nagy = Józsi;Józsi.névki();Nagy.névki();Console.WriteLine(Józsi.alkév);Console.WriteLine(Nagy.alkév);Oktató Kis = new Fıállású("Kis", "János");Kis.névki();Console.WriteLine(Kis.alkév);Oktató János = new Fıállású("Kis", "János", 2007);János.névki();Console.WriteLine(János.alkév);Console.ReadLine();

}}

Page 23: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 23

Fıprogram: mit ír ki?class Próba{public static void Main(){Fıállású Józsi = new Fıállású("Nagy", "József", 2005);Oktató Nagy = Józsi;Józsi.névki();Nagy.névki();Console.WriteLine(Józsi.alkév);//Console.WriteLine(Nagy.alkév);Oktató Kis = new Fıállású("Kis", "János");Kis.névki();//Console.WriteLine(Kis.alkév);Oktató János = new Fıállású("Kis", "János", 2007);János.névki();//Console.WriteLine(János.alkév);Console.ReadLine();

}}

Nincs ilyen!

Page 24: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 24

Eredmény

Page 25: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 25

Feladat: virtuális metódusok

Az Oktató osztály „névki” metódusát tegye virtuálissá!A Fıállású osztály „névki” metódusa legyen „override”!Készítse el az Óraadó osztályt, mely ugyancsak az Oktató osztály örököse, új adattétele a nyilvános string típusú „cég”.A „névki” metódus a teljes néven kívül írja ki a „cég” tartalmát is, de ne legyen „override” (azaz „new” legyen)!

Page 26: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 26

Oktató osztály

class Oktató{protected string veznév, kernév;public Oktató(string vn, string kn){veznév = vn;kernév = kn;}public virtual void névki(){Console.WriteLine(veznév+" "+kernév);

}}

Page 27: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 27

Fıállású

class Fıállású:Oktató{public ushort alkév;public Fıállású(string vn, string kn): base(vn,kn){}public Fıállású(string vn, string kn, ushort aé): base(vn,kn){alkév = aé;

}public override void névki(){Console.WriteLine(veznév + " " + kernév+" "+alkév);

}}

Page 28: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 28

Óraadó

class Óraadó: Oktató{public string cég;public Óraadó(string vn, string kn): base(vn, kn)

{ }public Óraadó(string vn, string kn, string cg): base(vn, kn)

{cég = cg;

}public new void névki(){Console.WriteLine(veznév + " " + kernév + " " + cég);

}}

Page 29: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 29

Fıprogram: melyik sor hibás?public static void Main()

{ Fıállású Józsi = new Fıállású("Nagy", "József", 2005);Oktató Nagy = Józsi;Józsi.névki();Nagy.névki();Console.WriteLine(Józsi.alkév);Oktató Kis = new Fıállású("Kis", "János");Kis.névki();Oktató János = new Fıállású("Kis", "János", 2007);János.névki();Óraadó Marcsi = new Óraadó("Közepes", "Marcsi", "IBM");Oktató Közepes = Marcsi;Oktató Hosszú = new Óraadó("Hosszú", "Tibor", "CIA");Marcsi.névki();Közepes.névki();Hosszú.névki();Console.WriteLine(Közepes.cég);Console.WriteLine(Marcsi.cég);Console.WriteLine(Hosszú.cég);Console.ReadLine(); }

Page 30: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 30

Fıprogram: mit ír ki?public static void Main(){ Fıállású Józsi = new Fıállású("Nagy", "József", 2005);Oktató Nagy = Józsi;Józsi.névki();Nagy.névki();Console.WriteLine(Józsi.alkév);Oktató Kis = new Fıállású("Kis", "János");Kis.névki();Oktató János = new Fıállású("Kis", "János", 2007);János.névki();Óraadó Marcsi = new Óraadó("Közepes", "Marcsi", "IBM");Oktató Közepes = Marcsi;Oktató Hosszú = new Óraadó("Hosszú", "Tibor", "CIA");Marcsi.névki();Közepes.névki();Hosszú.névki();//Console.WriteLine(Közepes.cég);Console.WriteLine(Marcsi.cég);//Console.WriteLine(Hosszú.cég);Console.ReadLine(); }

Nincs ilyen!

Page 31: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 31

Eredmény

new

override

Page 32: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 32

Feladat: absztrakt metódus és osztály

Legyen az elıbbi feladatban a „névki” metódus és így az Oktatóosztály absztrakt!

Page 33: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 33

Oktató osztály

abstract class Oktató{protected string veznév, kernév;public Oktató(string vn, string kn){veznév = vn;kernév = kn;}public abstract void névki();

}

Nincs törzse!

Absztrakt

Page 34: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 34

Fıállású

class Fıállású:Oktató{public ushort alkév;public Fıállású(string vn, string kn): base(vn,kn){}public Fıállású(string vn, string kn, ushort aé): base(vn,kn){alkév = aé;

}public override void névki(){Console.WriteLine(veznév + " " + kernév+" "+alkév);

}}

Page 35: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 35

Óraadó

class Óraadó: Oktató{public string cég;public Óraadó(string vn, string kn): base(vn, kn)

{ }public Óraadó(string vn, string kn, string cg): base(vn, kn)

{cég = cg;

}public override void névki(){Console.WriteLine(veznév + " " + kernév + " " + cég);

}}

Nem lehet „new”!

Page 36: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 36

Fıprogram: melyik sor hibás?public static void Main()

{ Fıállású Józsi = new Fıállású("Nagy", "József", 2005);Oktató Nagy = Józsi;Józsi.névki();Nagy.névki();Console.WriteLine(Józsi.alkév);Oktató Kis = new Fıállású("Kis", "János");Kis.névki();Oktató János = new Fıállású("Kis", "János", 2007);János.névki();Óraadó Marcsi = new Óraadó("Közepes", "Marcsi", "IBM");Oktató Közepes = Marcsi;Oktató Hosszú = new Óraadó("Hosszú", "Tibor", "CIA");Marcsi.névki();Közepes.névki();Console.WriteLine(Marcsi.cég);Oktató Pici = new Oktató("Pici", "Juliska");Pici.névki();Console.ReadLine(); }

Page 37: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 37

Fıprogram: mit ír ki?public static void Main(){ Fıállású Józsi = new Fıállású("Nagy", "József", 2005);Oktató Nagy = Józsi;Józsi.névki();Nagy.névki();Console.WriteLine(Józsi.alkév);Oktató Kis = new Fıállású("Kis", "János");Kis.névki();Oktató János = new Fıállású("Kis", "János", 2007);János.névki();Óraadó Marcsi = new Óraadó("Közepes", "Marcsi", "IBM");Oktató Közepes = Marcsi;Oktató Hosszú = new Óraadó("Hosszú", "Tibor", "CIA");Marcsi.névki();Közepes.névki();Hosszú.névki();Console.WriteLine(Marcsi.cég);//Oktató Pici = new Oktató("Pici", "Juliska")//Pici.névki();Console.ReadLine(); }

Absztrakt!

Page 38: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 38

Eredmény

Override!

Page 39: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 39

Feladat

Készítsen számológépet: a „Számoló” osztály tartalmazzon egy „Kalk” metódust, mely adott mőveleti kódra elvégzi két operandus között a megfelelı mőveletet. (A Kalk metódus az adatokat az osztály adattagjaiból vegye, ezeket a konstruktor állítsa be.)A „Számol” osztály készítsen ebbıl egy „Kiszámol”nevő példányt, kérjen be két operandust és egy mőveleti kódot, végeztesse el a mőveletet, majd írja ki az eredményt.

Page 40: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 40

Számoló osztály: a Konstruktor

class Számoló{private float op1,op2;private char mővelet;private float eredmény;public Számoló(float op10, float op20, char mővelet0){op1 = op10;op2 = op20;mővelet = mővelet0;eredmény = 0;}

Page 41: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 41

Számoló osztály: a Kalk metóduspublic float Kalk(){switch (mővelet){case '+': eredmény = op1 + op2;break; case '-': eredmény = op1 - op2;break;case '*': eredmény = op1 * op2;break;case '/': eredmény = op1 / op2;break;}return eredmény;}}

Page 42: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 42

A Számol osztályclass Számol{static void Main(){float x,y;char z;System.Console.Write("Elsı operandus: ");x=float.Parse(System.Console.ReadLine());System.Console.Write("Mőveleti jel: ");z=char.Parse(System.Console.ReadLine());System.Console.Write("Második operandus: ");y=float.Parse(System.Console.ReadLine());Számoló Kiszámol= new Számoló(x,y,z);System.Console.WriteLine(x+" "+z+" "+y+" = "+Kiszámol.Kalk());System.Console.ReadLine();}}

Page 43: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 43

Egységbe zárás

A „private” (alapértelmezés) vagy „protected”láthatóságú adattételek kívőlrıl nem érhetıek el.

.

.System.Console.WriteLine(x+" "+z+" "+y+" = "+Kiszámol.eredmény);

.

.

Próbáljuk közvetlenül kiírni az eredményt:

Page 44: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 44

Egyszerő öröklés

Készítsük el a „Számoló” osztály örökösét, a „Számolgató” osztályt, mely pontos mása az ısnek.

Page 45: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 45

A „Számolgató” osztályclass Számolgató:Számoló{public Számolgató(float op10, float op20, char mővelet0):

base(op10,op20,mővelet0){}

}

A Számolgató és a Számoló ugyanazokkal az adattételekkel és metódusokkal rendelkezik, de a Számoló konstruktora paraméteres, így automatikusan nem hívódik meg. A „base” tétel használata után már ugyanúgy hívhatjuk:

.

.Számolgató Kiszámol= new Számolgató(x,y,z);..

Page 46: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 46

Többalakúság I.

Bıvítsük a „Számolgató” osztály „Kalk” metódusát egy új mővelettel: a „<„ mővelet eredménye legyen a két operandus közül a kisebb.

Page 47: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 47

Az adattételek

protected float op1,op2;protected char mővelet;protected float eredmény;

A „private” (ez az alapértelmezés) adattételek az örökös nem örökölt metódusai számára sem láthatók!

Page 48: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 48

A módosított Kalk metóduspublic new float Kalk(){switch (mővelet){case '+': eredmény = op1 + op2;break; case '-': eredmény = op1 - op2;break;case '*': eredmény = op1 * op2;break;case '/': eredmény = op1 / op2;break;case '<': if (op2 < op1)

{ eredmény = op2; }else{ eredmény = op1; }break;

}return eredmény;}

Page 49: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 49

Hívásclass Számol{static void Main(){float x,y;char z;System.Console.Write("Elsı operandus: ");x=float.Parse(System.Console.ReadLine());System.Console.Write("Mőveleti jel: ");z=char.Parse(System.Console.ReadLine());System.Console.Write("Második operandus: ");y=float.Parse(System.Console.ReadLine());Számolgató Kiszámol= new Számolgató(x,y,z);System.Console.WriteLine(x+" "+z+" "+y+" = "+Kiszámol.Kalk());System.Console.ReadLine();}}

Page 50: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 50

Többalakúság II.: korai kötés

Bonyolítsuk a ”Számoló” és a „Számolgató” osztályokat: ne a „Kalk” metódus legyen kívülrıl elérhetı, hanem a „Kalkuláló” metódus, mely meghívja a „Kalk”-ot.

Page 51: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 51

Változások a „Számoló” osztályban.protected float Kalk(){switch (mővelet)..return eredmény;}

public float Kalkuláló(){return Kalk();}

Page 52: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 52

Változások a „Számolgató”osztályban

.protected new float Kalk(){switch (mővelet)..return eredmény;}

Page 53: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 53

Kérdés

A „Kalk” metódust újra definiáltuk, de a „Kalkuláló” metódust nem. A „Számolgató”osztályban a „Kalkuláló” melyik „Kalk”-othívja meg?

Válasz

Az eredetit. Ez a „korai kötés”. (Ha a „<„mőveletet adjuk meg, az eredmény 0 lesz.)

Page 54: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 54

A késıi kötés

Tegyük a „Kalk” metódust virtuálissá!

Page 55: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 55

A Kalk metódus (Számoló)

protected virtual float Kalk(){switch (mővelet){case '+': eredmény = op1 + op2;break; case '-': eredmény = op1 - op2;break;case '*': eredmény = op1 * op2;break;case '/': eredmény = op1 / op2;break;}return eredmény;}

Page 56: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 56

A Kalk metódus (Számolgató)protected override float Kalk(){switch (mővelet){case '+': eredmény = op1 + op2;break; case '-': eredmény = op1 - op2;break;case '*': eredmény = op1 * op2;break;case '/': eredmény = op1 / op2;break;case '<': if (op2 < op1)

{ eredmény = op2; }else{ eredmény = op1; }break;

}return eredmény;}

Page 57: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 57

Kérdés

A „Kalk” metódust újra definiáltuk, de a „Kalkuláló” metódust nem. A „Számolgató”osztályban a „Kalkuláló” melyik „Kalk”-othívja meg?

Válasz

Az újat. Ez a „késıi kötés”. (Ha a „<„mőveletet adjuk meg, az eredmény jólesz.)

Page 58: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 58

Mentsük el ezt a programot, mert késıbb még szükség lesz rá!

Page 59: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 59

FeladatEgy korábbi feladat módosításaképpen készítsen absztrakt „Vonatdef” osztályt, melyben a „beolvas” az állomások neve, az indulások ideje (max 100 db), és ezek az osztály adattételeiben tárolódnak.Az üres állomásnév jelentse a beolvasás végét.Legyen adattétel a „típus” string változó is.A „kiír” metódus kiírja a vonat adatait a képernyıre.A „betípus” absztrakt metódus legyen.Készítse el a „Vonatdef” osztály örököseit a „Gyorsvonat” és a „Személyvonat” osztályokat, melyekben a „betípus” metódus beírja a vonat típusát a „típus” adattételbe.Készítsen „Vonatkez” osztályt, melyben a fenti osztály példányait egyetlen tömbben helyezi el, beírja az adatokat, majd kiírja azokat a képernyıre.

Page 60: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 60

Vonatdef osztály: adattételek

abstract class Vonatdef{protected string típus;protected string vonatnév;protected string[,] állomások = new string[100, 2];protected int hányállomás = 0;

Page 61: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 61

Vonatdef osztály: beolvaspublic void beolvas(){string s;betípus();System.Console.WriteLine("add meg a vonat nevét! ");vonatnév = System.Console.ReadLine();for (int i = 0; i < 100; i++){System.Console.WriteLine("add meg az" + (i + 1) + "-ik állomás

nevét! ");s = System.Console.ReadLine();if (s == "") return;hányállomás++;állomások[i, 0] = s;System.Console.WriteLine("add meg az" + (i + 1) + "-ik állomásról

indulás idejét! (oo:pp) ");állomások[i, 1] = System.Console.ReadLine();

}return;

}

Page 62: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 62

Vonatdef: kiír, betípus

public void kiír(){System.Console.WriteLine("Vonat típusa: " + típus + ".");System.Console.WriteLine("Vonat neve: " + vonatnév + ".");for (int i = 0; i < hányállomás; i++){System.Console.Write("Állomás neve: " + állomások[i, 0] + " ,");System.Console.WriteLine("indulás ideje: " + állomások[i, 1] + ".");

}return;

}

abstract public void betípus();

Absztrakt, nincs teste.

Pontosvesszıkell!

Page 63: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 63

Gyorsvonat osztály

class Gyorsvonat:Vonatdef{public override void betípus(){típus="Gyorsvonat";

}}

Page 64: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 64

Személyvonat osztály

class Gyorsvonat:Vonatdef{public override void betípus(){típus=„Személyvonat";

}}

Page 65: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 65

Vonatkez osztály

class Vonatkez{static void Main(){Vonatdef [] vonat = new Vonatdef[5];vonat[1]= new Gyorsvonat();vonat[1].beolvas();vonat[1].kiír();vonat[2] = new Személyvonat();vonat[2].beolvas();vonat[2].kiír();System.Console.ReadLine();

}}

Page 66: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 66

Feladat

Készítsen a „Vonatdef” osztályban olyan metódust, mely a vonat nevét képes megváltoztatni.

Page 67: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 67

A névváltoztató metódus I.

public void névvált(){System.Console.WriteLine

"Add meg az új vonatnevet! "); vonatnév=System.Console.ReadLine();

}

Page 68: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 68

Vonatkez osztály II.class Vonatkez{static void Main(){Vonatdef [] vonat = new Vonatdef[5];vonat[1]= new Gyorsvonat();vonat[1].beolvas();vonat[1].kiír();vonat[1].névvált();vonat[1].kiír();vonat[2] = new Személyvonat();vonat[2].beolvas();vonat[2].kiír();vonat[2].névvált();vonat[2].kiír();System.Console.ReadLine();

}}

Page 69: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 69

Feladat

Végezze el ugyanezt a „beolvas” metódus átdefiniálásával.

Page 70: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 70

A névváltoztató metódus II.

public void beolvas(string vonatnév){this.vonatnév=vonatnév;}

Vanparaméter

Használat:System.Console.WriteLine("Add meg az új vonatnevet! "); S=System.Console.ReadLine();vonat[1].beolvas(s);vonat[1].kiír();

Ha azonosa paraméter és az adattétel

neve

Page 71: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 71

Dummy paraméter

public void beolvas(int x){this.vonatnév=System.Console.ReadLine();}

Vanparaméter

Használat:System.Console.WriteLine("Add meg az új vonatnevet! "); vonat[1].beolvas(123);vonat[1].kiír(); Mindegy, csak

int legyen

Page 72: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 72

Vonatkez osztály III.class Vonatkez{static void Main(){Vonatdef [] vonat = new Vonatdef[5];vonat[1]= new Gyorsvonat();vonat[1].beolvas();vonat[1].kiír();System.Console.WriteLine("Add meg az új vonatnevet! ");vonat[1].beolvas(123);vonat[1].kiír();vonat[2] = new Személyvonat();vonat[2].beolvas();vonat[2].kiír();System.Console.WriteLine("Add meg az új vonatnevet! ");vonat[2].beolvas(123);vonat[2].kiír();System.Console.ReadLine();

}}

Page 73: Objektumorientált programozás C# nyelven II.users.nik.uni-obuda.hu/szollosi/docs/oop/OOPKD06.pdf · („Macska”helyén nem szerepelhet „Állat”) A típusátalakítássikerülni

2008.11.11. 73

FeladatKészítsünk egy absztrakt Árú osztályt. Tartalmazzon név, készlet, maxDb, és nettóÁr mezıket az egységbezárás adatrejtés elvét betartva. Készítsünk utódosztályokat: TejTermék utódosztály minden tagjának típusa tejtermék legyen és tartalmazzon egy zsírtartalom nevő értéket. A pékárú minden tagjának pékárú legyen a típusa és adjuk meg, hogy friss, vagy tartós termék. Az édességeknél határozzuk meg a tartalmaz-e cukrot mezıt. Minden osztálynak legyen Kiír tagfüggvénye, mely a konzolra kiírja az adott osztály tagjait és azok értékét.Egy tömbben tároljuk az árúkat. Töltsük fel a tömböt, különbözı típusú árúkkal!Írjuk ki a tömb elemeit a konzolra!Számítsuk ki a raktárkészlet értékét!