Absztrakt típus

A Wikipédiából, a szabad enciklopédiából

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]

  1. 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
  2. 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.)
  3. Pure Virtual Functions and Abstract Classes in C++. GeeksforGeeks.org, 2014. július 15.
  4. Riel, Arthur. Object-Oriented Design Heuristics. Addison-Wesley Professional, 89. o. (1996). ISBN 0-201-63385-X 
  5. 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]

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