A programozási nyelvekben az absztrakt típus (abstract type) egy nominálisan tipizált rendszer olyan típusa, amely nem példányosítható közvetlenül; vagyis nem konkrét típus. Egy absztrakt típus minden példánya valamilyen konkrét altípus példánya. Az absztrakt típusokat egzisztenciális típusoknak is nevezik.Mitchell, John C.; Plotkin, Gordon D.; Abstract Types Have Existential Type, ACM Transactions on Programming Languages and Systems, Vol. 10, No. 3, July 1988, pp. 470–502
Előfordulhat, hogy az absztrakt típus nem vagy hiányos implementációt biztosít. Egyes nyelveken a implementáció nélküli absztrakt típusokat protokolloknak, interfészeknek, aláírásoknak vagy osztálytípusoknak nevezik. Az osztályalapú objektumorientált programozásban az absztrakt típusokat absztrakt osztályokként, a konkrét típusokat pedig konkrét osztályokként valósítják meg. A generikus programozásban hasonló fogalom a „koncepció”, amely hasonlóképpen meghatározza a szintaxist és a szemantikát, de nem igényel altípus-kapcsolatot: két egymástól független típus is kielégítheti ugyanazt a koncepciót.
Gyakori, hogy az absztrakt típusok több egyedi implementációval rendelkeznek, például konkrét altípusok formájában, amelyek példányosíthatók. Az objektumorientált programozásban egy absztrakt osztály absztrakt metódusokat vagy absztrakt tulajdonságokat tartalmazhat, amelyek megoszlanak az alosztályok között. Az absztrakt típusok implementációjára használt (vagy használható) nyelvi jellemzők egyéb nevei közé tartoznak a tulajdonságok, keverékek, ízek, szerepek vagy típusosztályok.
Absztrakt típusok jelzése Az absztrakt osztályokat többféleképpen lehet létrehozni, jelölni vagy szimulálni:
Az abstract explicit kulcsszó használatával az osztálydefinícióban (Java, D, C Sharp). Az osztálydefinícióba egy vagy több absztrakt metódus (a C++ nyelvben teljesen virtuális függvények) beépítésével, amelyeket az osztály elfogad protokollja részeként, de amelyekhez nincs implementáció. Absztrakt típusból való örökléssel, nem felülírva az osztálydefinícióhoz szükséges összes hiányzó jellemzőt. Más szóval, egy leszármazott típus, amelyik nem implementálja a szülő az összes absztrakt metódusát, maga is absztrakt lesz. Számos dinamikusan tipizált nyelvben, például Smalltalkban, absztraktnak tekinthető minden olyan osztály, amely egy adott metódust küld a this-re, de nem implementálja azt. (Azonban sok ilyen nyelvben, mint például Objective-C, a hiba nem észlelhető az osztály használatáig, majd hibaüzenetet ad, például Does not recognize selector: xxx).
Példa (Java) // Alapértelmezés szerint minden osztályban minden metódus konkrét, kivéve, ha az abstract kulcsszót használjuk. abstract class Demo { // Egy absztrakt osztály tartalmazhat absztrakt metódusokat, amelyeknek nincs implementációjuk. abstract public int sum(int x, int y);
// Egy absztrakt osztály konkrét módszereket is tartalmazhat. public int product(int x, int y) { return x*y; } }
// Alapértelmezés szerint az összes interfész összes metódusa absztrakt, kivéve, ha az alapértelmezett kulcsszót használja. interface DemoInterface { [abstract] int getLength(); // Az absztrakt itt használható, bár teljesen haszontalan.
// Az alapértelmezett kulcsszó ebben az összefüggésben használható konkrét metódus megadására egy felületen. default int product(int x, int y)
return x * y;
}Fájl:UML class pet.svg
Absztrakt típusok használata Az absztrakt típusok fontos jellemzői a statikusan tipizált OOP nyelveknek. Sok dinamikusan tipizált nyelvnek nincs ekvivalens funkciója (bár a kacsatesztes típusolás használata szükségtelenné teszi az absztrakt típusokat); egyes modern, dinamikusan tipizált nyelvekben azonban megtalálhatók a vonások (traits).
Egyes szerzők azzal érvelnek, hogy minden osztálynak vagy levélosztályoknak (altípusok nélkül), vagy pedig elvontnak kell lenniük.
Az absztrakt típusok hasznossága abban rejlik, hogy képesek protokollokat meghatározni és érvényesíteni, amelyek lényegében olyan műveletek halmazát jelentik, amelyeket a protokollt implementáló összes objektumnak támogatnia kell.
Az absztrakt típusok lényeges részét képezik a Template Method Patternnek.
Jegyzetek
Fordítás
További irodalom
Core Java: An Integrated Approach by R. Nageswara Rao
További információk "Abstract or Skeletal Interfaces Explained" Types and Programming Languages, Benjamin Pierce (MIT Press 2002) Abstract type, Rosetta Code
Kategória:Java-kódpéldák Kategória:Szoftverfejlesztés