130 likes | 234 Views
Microsoft.NET környezet. Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz. 1. Öröklődés, és szabályai. Ö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
E N D
Microsoft.NET környezet Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz 1
Öröklődés, és szabályai Ö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. 2
Öröklődés, és szabályai 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! 3
Öröklődés, és szabályai 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; } } 4
Öröklődés, és szabályai class TElso { private int x; protected int y; public int 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; } 5
Öröklődés, és szabályai 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’! 6
Öröklődés, és szabályai class TElso { public int z = 1; public int akarmi() { return z+1; } } class TNegyedik:TElso { new public float z =5.1; } TNegyedik N = new TNegyedik(); double f = N.z; int g = N.akarmi(); Mennyi? Miért? Mennyi? Miért? 7
Öröklődés, és szabályai 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 ). 8
Öröklődés, és szabályai 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. 9
Öröklődés, és szabályai 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; } } TElso E = new TElso(); int ne = E.akarmi(); Miért nem kell a new ? 30! Miért? 11! Miért? TOtodik O = new TOtodik(); int no = O.akarmi(10); 10
Öröklődés, és szabályai 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;} } Miért kell a new? Jó ez a megoldás? 21! Miért? THatodik H = new THatodik(); int nh = H.akarmi(); 11
Öröklődés, és szabályai 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. 12
Öröklődés, és szabályai 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. 13