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 Öröklődés : Egy új osztály fejlesztése egy már meglévő osztály felhasználásával. Az új osztály (gyermekosztály) eleve tartalmaz minden mezőt, és metódust az általa választott őstől. Lehetőség van az örökölt mezőket felhasználni, de új mezőket is felvenni (bővítés). Lehetőség van az örökölt metódusokat meghívni (mintha eleve a sajátunk lenne), és új metódusokat is definiálni.

3 3 Mezők öröklődésének szabályai: 1. minden mezőt öröklünk, még a private mezőket is 2. A private mezőkre nem tudunk az új osztályban közvetlenül hivatkozni, de közvetve igen (meghívunk egy örökölt metódust, amely a törzsében felhasználja a private mezőt) 3. Nem szoktunk ugyanolyan nevű mezőt bevezetni, mint amilyet már örököltünk, mert az zavaró… 4. A C# ezt megengedi, de megerősítést kér. 5. Ha mégis megtesszük, akkor ez újbóli definiálásnak számít, és ennek során akár a más mezőtípust is választhatunk. 6. De ez csak ‘elfedi’ az örököltet, meg nem változtatja azt!

4 4 class TGepJarmu { private int benzinMennyiseg = 0; public int tankMerete; // literben public void teleTankol() { benzinMennyiseg = tankMerete; } class TGepJarmu { private int benzinMennyiseg = 0; public int tankMerete; // literben public void teleTankol() { benzinMennyiseg = tankMerete; } class TAuto:TGepJarmu { public int szallithatoSzemelyek = 4; public bool tele_e_Tank() { return benzinMennyiseg==tankMerete; } class TAuto:TGepJarmu { public int szallithatoSzemelyek = 4; public bool tele_e_Tank() { return benzinMennyiseg==tankMerete; }

5 5 class TElso { private int x; protected int y; public int z; } class TElso { private int x; protected int y; public int z; } class TMasodik:TElso { public double x; public string y; public float z; } class TMasodik:TElso { public double x; public string y; public float z; } class THarmadik:TElso { public double x; new public string y; new public float z; } class THarmadik:TElso { public double x; new public string y; new public float z; }

6 6 Mezők öröklődésének szabályai: Egy private mezőt a gyermekosztály eleve nem is ‘látja’, ezért ugyanolyan nevű bevezetésének nincs semmi akadálya. A protected, public mezőket viszont ‘látja’, ezért ugyanolyan nevű mező bevezetéséhez a C# megerősítést kér, ez a ‘tudom mit csinálok’ jelzés. A kulcsszó ‘new’!

7 7 class TElso { public int z = 1; public int akarmi() { return z+1; } class TElso { public int z = 1; public int akarmi() { return z+1; } class TNegyedik:TElso { new public float z =5.1; } class TNegyedik:TElso { new public float z =5.1; } TNegyedik N = new TNegyedik(); double f = N.z; int g = N.akarmi(); TNegyedik N = new TNegyedik(); double f = N.z; int g = N.akarmi(); Mennyi? Miért?

8 8 Mezők öröklődésének szabályai: Egy fejletteb osztályban felüldefiniálhatunk egy mezőt, de ezt a tényt az ős osztály nem érzékeli. Az ős osztály metódusai még mindig az ő eredeti mezőjét ‘látja’. Ha viszont tovább származtatunk az új gyerek- osztályból, az ő leszármazottjai már az új mezőt ‘látják’ ( elfedés ).

9 9 Metódusok öröklődésének szabályai: Ha a metódus paraméterezését megváltoztatjuk, akkor az overloading szabályai vonatkoznak rá (nem fedi el az eredetit). Egy fejletteb osztályban felüldefiniálhatunk egy metódust, de ezt a tényt az ős osztály nem érzékeli. Az ős osztály metódusai még mindig az ő eredeti metódusukat ‘látja’ csak.

10 10 class TElso { public int szamol() { return 10; } public int akarmi() { return szamol()+1;} } class TElso { public int szamol() { return 10; } public int akarmi() { return szamol()+1;} } class TOtodik:TElso { new public int szamol() { return 20; } public int akarmi(int x ) { return szamol()+x; } } class TOtodik:TElso { new public int szamol() { return 20; } public int akarmi(int x ) { return szamol()+x; } } TElso E = new TElso(); int ne = E.akarmi(); 11! Miért? TOtodik O = new TOtodik(); int no = O.akarmi(10); 30! Miért? Miért nem kell a new ?

11 11 class TElso { public int szamol() { return 10; } public int akarmi() { return szamol()+1;} } class TElso { public int szamol() { return 10; } public int akarmi() { return szamol()+1;} } class THatodik:TElso { new public int szamol() { return 20; } new public int akarmi() { return szamol()+1;} } class THatodik:TElso { new public int szamol() { return 20; } new public int akarmi() { return szamol()+1;} } THatodik H = new THatodik(); int nh = H.akarmi(); 21! Miért? Miért kell a new? Jó ez a megoldás?

12 12 Metódusok öröklődésének szabályai: A gyerekosztálybeli ‘new’ metódusokat az ős osztály nem érzékeli, nem tudja használni. Ennek oka a ‘korai kötés’ (early binding). Korai kötés során a fordító program fordításkor összeköti a metódushívást egy konkrét metódusváltozattal. A TElso.akarmi()-ben lévő fv hívás ( szamol() ) összekötésre kerül egy konkrét metódussal, jelen esetben ez az TElso.szamol változattal.

13 13 A korai kötés: A korai kötés miatt értelmetlennek tűnik ugyanolyan nevű és paraméterezésű metódus létrehozása (new). Ezt a metódust már csak a belőle származtatott osztályok láthatják, visszamenőleg nem érvényesül. A késői kötés: A másik lehetőség a késői kötés, melyet később ismertetünk a virtuális metódusok kapcsán.


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