Interface Implementation in Microsoft.NET Environment for Better Code Organization
120 likes | 210 Vues
Learn how to utilize interfaces instead of a common base class for improved flexibility in programming, avoiding issues with multiple inheritance. This guide from Zoltán Hernyák at Eszterházy Károly College covers various approaches and best practices.
Interface Implementation in Microsoft.NET Environment for Better Code Organization
E N D
Presentation Transcript
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 { 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
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
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
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
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
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
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
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
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
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
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