Gyakorlati alapok III.
Az interfész (interface)
Az objektumorientált programozás talán legfontosabb jellegzetessége az osztályok közti szabályozott, de mégis hatékony kommunikáció. Amint azt tapasztalhatjuk, az osztályok a külvilág felé alapjában véve zártak (encapsulation). Ennek több oka van, az egyik, hogy védik saját, belső adataikat, műveleteiket (metódusaikat).
Ennek megértése viszonylag könnyű, ha belátjuk annak abszurditását, ha személyes dolgaink felügyeletét, ügyintézését vadidegenekre bízzuk.
A zártság tehát egyfelől biztonsági szempont, ám másfelől része egy magasabb szintű logikai struktúra kialakításának is, hiszen a zártság fenntartásával különböző tulajdonságú osztályok hozhatók létre. Tulajdonképpen (többek között) ez az elvi szempont érvényesül az API-osztályhierarchia, tágabb értelemben bármilyen, valamilyen logikai szempont szerint rendezett osztályszerkezet kialakításában.
Ha logikusan követjük a gondolatmenetet, akkor a fentiekből az következik, hogy a kialakított osztályhierarchiánk tökéletesen különböző osztályokból fog állni és ezeket ilyen-olyan logikai szempontok szerint továbbrendezett csomagokba (package) fogjuk sorolni. Ez így alapvetően már működőképes egységet alkot, mert ugyan szabályozott körülmények között, de az osztályok elérhetik egymás adatait, műveleteit.
(Mindeközben azonban ne felejtsük el, hogy az osztályok bár alapvetően különböző funkcionalitásúak, ám egyúttal sok azonos elemet is tartalmaznak, például az öröklődés miatt.)
Létezhet azonban egy további, speciális, már osztályok feletti kapcsolódási szempont, ez pedig az interfész (interface). Az interfész használatával lehetőségünk nyílik arra, hogy:
-
a különböző tulajdonságú osztályokban közös tulajdonságokat alakítsunk ki, másképpen fogalmazva: különböző tulajdonságú osztályokat közös tulajdonságokkal kapcsoljunk össze,
-
a közös tulajdonság(ok), amelyet interfész segítségével valósítunk meg, osztályok feletti kapcsolódást tesz lehetővé anélkül, hogy az osztály veszítene koncepcionális zártságából.
Az interfész eredeti jelentése jól tükrözi ezt a szándékot, hiszen (kapcsolódási) felületet jelent. De vajon mit értünk az osztályok "különböző és közös tulajdonságai" alatt?
Az osztályok adatokból és a rajtuk elvégzendő műveletekből állnak, mindegyikük 1-1 jól meghatározott feladat végrehajtására összeválogatva. Az osztályhierarchia mindenkor kiválóan tükrözi ezt a logikai csoportosítási szempontot.
Ha 2 osztály funkcionalitásában, működésében azonos (azaz közös tulajdonságúak), akkor a kapott bemeneti adatokból azonos kimeneti adatokat fognak produkálni. Ez azonban csak elméleti megközelítés, mert az osztályhierarchián belül nem sok értelme van az efféle kódredundanciának.
Ehelyett benne annál több, funkcionalitásában, működésében különböző (azaz különböző tulajdonságú) osztályt fogunk találni, amelyek között egyfajta hídként az interfész lehetőségét használhatjuk fel, ha 2 különböző osztály között közös tulajdonságokat akarunk kialakítani.