Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.

Hasonló előadás


Az előadások a következő témára: "1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz."— Előadás másolata:

1 1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz

2 2 Az osztályhierachia fejlesztése közben egy adott szinten még nem tudunk megírni bizonyos metódusokat, de felhasználni már fel tudnánk ezeket a metódusokat… class TAltalanosGrafikusObjektum { public int X=0; public int Y=0; public void Kirajzol() { ???? } public void Letorol() { ???? } public void Elmozgat(int ujX, int ujY) { Letorol(); X = ujX; Y = ujY; Kirajzol(); } class TAltalanosGrafikusObjektum { public int X=0; public int Y=0; public void Kirajzol() { ???? } public void Letorol() { ???? } public void Elmozgat(int ujX, int ujY) { Letorol(); X = ujX; Y = ujY; Kirajzol(); }

3 3 class TAltalanosGrafikusObjektum {... public virtual void Kirajzol() {} public virtual void Letorol() {} } class TAltalanosGrafikusObjektum {... public virtual void Kirajzol() {} public virtual void Letorol() {} } class TKor:TAltalanosGrafikusObjektum { public double sugar = 0; public override void Kirajzol() {... konkrét kör kirajzolása... } public override void Letorol() {... konkrét kör letörlése... } class TKor:TAltalanosGrafikusObjektum { public double sugar = 0; public override void Kirajzol() {... konkrét kör kirajzolása... } public override void Letorol() {... konkrét kör letörlése... }

4 4 Vegyük észre, hogy a két metódus kötelezően virtuális, különben a korai kötés miatt az ‘Elmozgat()’ nem tudná meghívni a későbbi, elkészült fv-eket… Az előző megoldás azért nem ‘jó’, mert ugyan működik, de a TKor-t fejlesztő programozót senki sem figyel- mezteti, hogy a fenti két metódust neki lényegében kötelező megírnia! Ráadásul a két metódus törzse bár üres, de a generált kódban (.exe) benne van, és valahány byte-t elfoglal, feleslegesen…

5 5 A megoldás: az ilyen jellegű metódusokat meg kell jelölni az ‘abstract’ kulcsszóval. Ekkor a metódusok törzsét nem is kell kifejteni, de még jelölni sem! De ilyenkor az osztályt is meg kell jelölni! abstract class TAltalanosGrafikusObjektum { public int X=0; public int Y=0; public void abstract Kirajzol(); public void abstract Letorol(); public void Elmozgat(int ujX, int ujY) { Letorol(); X = ujX; Y = ujY; Kirajzol(); } abstract class TAltalanosGrafikusObjektum { public int X=0; public int Y=0; public void abstract Kirajzol(); public void abstract Letorol(); public void Elmozgat(int ujX, int ujY) { Letorol(); X = ujX; Y = ujY; Kirajzol(); }

6 6 Az absztrakt osztályokból nem szabad példányosítani (meghívni közvetlenül a konstruktorukat). Ez logikus, hiszen nincsenek készen! abstract class TAltalanosGrafikusObjektum { public void abstract Kirajzol(); public void abstract Letorol(); } abstract class TAltalanosGrafikusObjektum { public void abstract Kirajzol(); public void abstract Letorol(); } TAltalanosGrafikusObjektum VMT Kirajzol | --- nincs --- Letorol | --- nincs --- Kirajzol | --- nincs --- Letorol | --- nincs --- Az absztrakt metódusok automatikusan virtuálisnak minősülnek. De a VMT táblában még nem tud mi bekerülni, hiszen ezek a metódusok nincsenek meg!

7 7 abstract class TAltalanosGrafikusObjektum {... public abstract void Kirajzol(); public abstract void Letorol(); } abstract class TAltalanosGrafikusObjektum {... public abstract void Kirajzol(); public abstract void Letorol(); } class TKor:TAltalanosGrafikusObjektum { public double sugar = 0; public override void Kirajzol() {... konkrét kör kirajzolása... } public override void Letorol() {... konkrét kör letörlése... } class TKor:TAltalanosGrafikusObjektum { public double sugar = 0; public override void Kirajzol() {... konkrét kör kirajzolása... } public override void Letorol() {... konkrét kör letörlése... }

8 8 Mivel minden abstract metódus egyben virtuális is: - ezért a ‘virtual’ kulcsszót már nem kell kiírni ( nem is szabad ! ) - osztályszintű metódusok nem lehetnek abstract-ak - property is lehet abstract abstract class TValami {... public abstract int X { get; set; } } abstract class TValami {... public abstract int X { get; set; } }

9 9 A gyerekosztályban továbbra sem kötelező az összes absztrakt metódust és property-t kifejleszteni, de ez esetben a gyerekosztályt is meg kell jelölni az ‘abstract’ jelzővel, és a gyerekosztályból sem lehet példányosítani… Érdekesség: az ‘abstract’ jelzőt akkor is rátehetem egy osztályra, ha az egyáltalán nem tartalmaz egyébként absztrakt metódusokat. Ekkor a fordító- program nem fogja engedni, hogy példányosítsanak ebből az osztályból…

10 10 Egy objektumosztályt megjelölhetek ‘sealed’ kulcsszóval is. Ez azt jelenti, hogy az osztályt már nem lehet továbbfejleszteni (nem lehet más osztályok őse). A sealed (‘lepecsételt’) kulcsszót nem lehet az ‘abstract’ jelzővel együtt szerepeltetni… sealed class TBefejezett {... } sealed class TBefejezett {... }


Letölteni ppt "1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz."

Hasonló előadás


Google Hirdetések