Absztrakt típus
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.[1]
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[2] 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
[szerkesztés]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.[2][3]
- 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)
[szerkesztés]// 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;
}
}
Absztrakt típusok használata
[szerkesztés]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.[4][5]
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
[szerkesztés]- ↑ 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
- ↑ a b Abstract Methods and Classes (The Java™ Tutorials > Learning the Java Language > Interfaces and Inheritance). Oracle.com. (Hozzáférés: 2019. augusztus 14.)
- ↑ Pure Virtual Functions and Abstract Classes in C++. GeeksforGeeks.org, 2014. július 15.
- ↑ Riel, Arthur. Object-Oriented Design Heuristics. Addison-Wesley Professional, 89. o. (1996). ISBN 0-201-63385-X
- ↑ Meyers, Scott. More Effective C++. Addison-Wesley Professional, 258. o. (1996). ISBN 0-201-63371-X „Make non-leaf classes abstract”
Fordítás
[szerkesztés]Ez a szócikk részben vagy egészben az Abstract type című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.
További irodalom
[szerkesztés]- Head First Java. O'Reilly Media, 688. o. (2003). ISBN 0-596-00920-8
- Core Java: An Integrated Approach by R. Nageswara Rao
További információk
[szerkesztés]- "Abstract or Skeletal Interfaces Explained" [1]
- Types and Programming Languages, Benjamin Pierce (MIT Press 2002) [2]
- Abstract type, Rosetta Code