1 / 12

Microsoft.NET környezet

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. Interface - közös ős helyett. class TElso:TValamilyenOs { public string info() { return ”Hello, én TElso vagyok!”; } } class TMasodik {

mireya
Download Presentation

Microsoft.NET környezet

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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

  2. Interface - közös ős helyett class TElso:TValamilyenOs { public string info() { return ”Hello, én TElso vagyok!”; } } class TMasodik { public string info() { return ”Hello, én TMasodik vagyok!”; } } void LekerInfo( ??? x ) { string s = x.info(); } Mit válasszunk „x” típusának, hogy mindkét osztályból származó példányra működjön a fenti példa? 2

  3. Interface - közös ős helyett void LekerInfo( Object x ) { string ret = String.Empty; if (x is TElso) ret = (x as TElso).info(); if (x is TMasodik) ret = (x as TMasodik).info(); return ret; } Mi a probléma ezzel a megoldással? Ha újabb osztályok bukkannak fel, akiknek van info() metódusuk, akkor újabb ‘if’-eket kell írni… 3

  4. Interface - közös ős helyett A probléma: Van két (vagy több) objektumosztályom, amelyeknek vannak közös vonásaik (egyforma nevű és paraméterezésű metódusaik), de nem állnak egymással ‘rokonságban’ ezen a téren – nem egymásból lettek származtatva. Nincs olyan közös ősük, amelyiknek már megvan ez a közös metódusa, még abstract szinten sem. 4

  5. Interface - közös ős helyett abstract class TInfo { public abstract string info(); } class TElso:TValamilyenOs, TInfo { public overridestring info() { return ”Hello, én TElso vagyok!”; } } class TMasodik:TInfo { public overridestring info() { return ”Hello, én TMasodik vagyok!”; } } Nem lehet 2 db ős egyszerre! A fenti megoldás sajnos nem működik… 5

  6. Interface - közös ős helyett interface TInfo { string info(); } class TElso:TValamilyenOs, TInfo { public string info() { return ”Hello, én TElso vagyok!”; } } class TMasodik:TInfo { public string info() { return ”Hello, én TMasodik vagyok!”; } } void LekerInfo( TInfo x ) { string s = x.info(); } 6

  7. Interface - közös ős helyett A megoldás: Az interface-ek nem osztályok! Nem lehet tőlük örökölni, mert nem tartalmaznak kidolgozott metódusokat, csak azok szignatúráját (prototípusát). Nem tartalmazhatnak mezőket, legfeljebb property-ket, de azoknak is csak a szignatúráját (mint az abstract-ban). Tartalmazhat indexelő-t is (szignatúrűját). Az interface-eket arra használjuk, hogy olyan közös tulajdonságokat írjanak le, amelyek egyébként egymással nem rokon objektumosztályok között fedezhető fel. 7

  8. Interface - közös ős helyett Szabályok: Az interface-ek-ben lévő metódusok és property deklarációk mindegyike kötelezően public, ezért az interface belsejében nem kell ezt külön jelölni, az osztályokban viszont ezt kötelezően public-ként kell megvalósítani! Az nincs előírva, hogy a metódust egyszerűen, vagy virtuális módon kell megvalósítani. Ha egy osztály ősei között fel van sorolva egy interface neve, akkor az adott osztály típusilag kompatibilis lesz ezzel az interface-el. Ekkor azt mondjuk, hogy az adott osztály implementálja ezt az interface-t. 8

  9. Interface - közös ős helyett Egy osztály implementál egy interface-t, ha - szerepel az ősei között felsorolva - az interface-ben leírt összes metódust és property-t a megfelelő szignatúrával megvalósít (tartalmazza a kidolgozását). Ha egy osztály ‘bevállal’ egy interface-t ősnek, akkor azzal kötelezettség is jár – meg is kell írni azokat a metódusokat, public módon! 9

  10. Interface - közös ős helyett interface TInfo { string gyerekNeve(int sorszam); double suly { get; set; } int fizetes { get; } int haviFix[int honap] { get; } } Metódus property Indexelő 10

  11. Interface - közös ős helyett Az OOP nyelvek két csoportja létezik: - interface-t támogató nyelvek (Delphi, C#, Java, …) - több közös ős is lehet ( C++ ) Itt az elsőnek bemutatott megoldás működik, nem iterface-t hozunk létre, hanem egy tényleges osztályt, amelyből akár örökölni is lehet. És a TElso-nek tényleg 2 őse van. abstract class TInfo { public abstract string info(); } class TElso:TValamilyenOs, TInfo { public overridestring info() { … } } 11

  12. Interface - közös ős helyett A közös őssel gondok vannak: class TEgyikOs { public int X=0; } class TMasikOs { public double X=0.0; } public class TEgyutt:TEgyikOs, TMasikOs { ... } TEgyutt e = new TEgyutt(); e.x = 12; // ??? 12

More Related