Az objektumorientált nyelvek, például a Java és a C # egyik kulcsfontosságú eleme az osztályok írásának képessége interfészek segítségével, amelyek szabványosítják a módszer definícióit és lehetővé teszik a fokozott polimorfizmust. Megbeszéljük, hogy mik ezek, és hogyan kell használni őket.
Formalizált polimorfizmus
Az interfészek alapvetően kód nélküli osztályok. Meg tudja határozni a tulajdonságokat és a módszereket (bár nem közvetlenül a mezőket) anélkül, hogy adatokat tárolna, vagy a függvények megvalósítását írná.
Például a .NET IEnumerable felülete nagyon gyakori. Ehhez csak egy olyan függvény szükséges, amely visszaad egy IEnumerator programot, amely felhasználható a gyűjtemény iterációjára.
-
public interface IEnumerable
-
{
-
IEnumerator GetEnumerator();
-
}
Minden gyűjtemény a .NET-ben megvalósítja ezt a felületet. Valójában a legtöbb gyűjtemény rengeteg interfészt valósít meg, mind szabványosítva a velük való együttműködés módszereit.
Ennek az az előnye, hogy ezt az eljárást szabványosítja az interfészen, így bármikor azt szeretné, ha valami sokféle osztályt elfogadna, az interfész metódusainak elérésével.
Például, foreach
hurkok a motorháztető alatt valóban csak használnak .GetEnumerator()
, így támogatni fognak bármilyen típusú gyűjteményt, amelyet megvalósítanak IEnumerable
, mint a Listák, szótárak és a HashSets.
-
void Main()
-
{
-
foreach(var item in IEnumerable)
-
{
-
// do something
-
}
-
}
Úgy gondolhatja, hogy az interfészek az alaposztályok helyettesítésére szolgálnak. Az alaposztályok továbbra is nagyon hasznosak, de nehézkes lehet, ha minden osztály megköveteli a módszerek öröklését és felülbírálását. Ráadásul csak egy alaposztálya lehet, de tetszőleges számú interfészt megvalósíthat.
Interfészeket is lehet használni a típusparaméterek helyett. Például lehet, hogy van egy egyedi gyűjteményed, CustomList<T>
. Ez bármilyen típusú típusnál működik, de ha egy adott metódust szeretett volna meghívni az egyes elemekre, akkor nem lehet, mivel a fordítónak fogalma sincs arról, hogy a használt típus támogatja-e ezt a módszert. Az egyetlen lehetőség, amelyet kapsz, az alapszintű módszerek lesznek objects
.
Ha azonban inkább elhagyná az általános típusú paramétert, és interfészt használna, meghívhat egy metódust az elemekre. A gyűjtemény továbbra is támogat bármilyen típusú típust, bár most minden elemnek, amelyet bele kíván tenni, meg kell valósítania a felületet.
Általában akkor kell interfészeket használnia, amikor ugyanazokat a módszereket használja újra sok olyan osztályhoz, amelyek nem öröklődnek egymástól, és olyan polimorf kódot szeretne írni, amely nem érdekli az adott mögöttes osztályt.
Interfészek használata
Az interfészek használata meglehetősen egyszerű. Ugyanazt az öröklési szintaxist használják, mint az alaposztályok, kettőspont az osztálydefiníció után. Ne feledje, hogy ha interfészt szeretne használni egy alaposztályral, akkor először az alaposztálynak kell lennie, utána vesszővel, majd az általa megvalósított összes interfésszel.
Miután hozzáadta az interfész definícióját, valószínűleg hibát fog kapni. A Visual Studio elmondja, hogy valójában nem valósítja meg az interfész tulajdonságait és metódusait. Ez valójában nagyon hasznos lehet, hiszen ha bármilyen módosítást hajt végre a felületen, el kell mennie és frissítenie kell az összes osztályt, amely megvalósítja azt.
A Visual Studio nagyon divatos, és ha a „potenciális javítások megjelenítése” lehetőségre kattint, akkor a VS lehetőséget kap arra, hogy automatikusan hozzáadja az interfész kazántáblát az osztályához. Nyilvánvalóan ki kell cserélnie a NotImplementedExceptions-t.
Felületeket is megvalósíthat kifejezetten. Ennek ugyanaz a hatása, de eltérő szintaxissal, amely egyértelművé teszi, hogy melyik felületről származik a módszer vagy a tulajdonság. Ez első ránézésre elég furcsának tűnik, de hasznos lehet, ha sok interfészt valósít meg.
Saját interfészek írása
Az interfészdefiníciók nagyjából megegyeznek az osztálydefiníciókkal, bár mindegyik metódusnak nem lesz törzse, és nyilvánvalóan az „interfész” szót kell használnia az „osztály” helyett. Az osztályokhoz hasonlóan az interfészek általános típusú paramétereket is használhatnak, amelyek hasznosak lehetnek az egyéni gyűjteményeknél.
Használhatja a { get; set; }
szintaxis a tulajdonságok implicit megadásához, amely akkor is működik, amikor a tényleges osztályban valósítja meg őket:
Lehet, hogy az interfészek öröklik egymást. Például ezt ICustomList
Az interfész sokkal hasznosabb lehet, ha egyszerűen az összes többi definíciót tartalmazza List
használ, de felvesz néhány egyedi. Most, amikor a felületet használja, meg kell valósítania az összes interfésztagot minden olyan felületről, amelytől örököl.