Az absztrakt osztály az objektumorientált programozásban olyan alaposztály , amely nem igényel példányosítást. Az absztrakt osztályok a gyakorlatban megvalósítják az OOP- polimorfizmus egyik alapelvét . Egy absztrakt osztály tartalmazhat vagy nem [1] ) absztrakt metódusokat és tulajdonságokat . Az absztrakt metódus nem abban az osztályban valósul meg, amelyben deklarálták, de meg kell valósítani a nem absztrakt leszármazottaihoz. Az absztrakt osztályok a legáltalánosabb absztrakciók, vagyis a legnagyobb mennyiséggel és a legkisebb tartalommal rendelkeznek .
Egyes nyelveken tilos absztrakt osztályok példányait létrehozni, máshol megengedett (például Delphi), de az osztály objektumának absztrakt metódusának elérése a program végrehajtása során hibát eredményez. Sok nyelvben elfogadható bármely osztályt absztraktnak nyilvánítani, még akkor is, ha nincsenek absztrakt metódusai (például Java), pontosan a példányosítás tiltása érdekében. Az absztrakt osztály felfogható az általa származtatott osztálycsalád interfészének , de a klasszikus interfészekkel ellentétben az absztrakt osztálynak lehetnek bizonyos metódusai és tulajdonságai is.
Az absztrakt módszerek mindig virtuálisak , de az „absztrakt” és a „virtuális” különböző fogalmak.
A Delphiben egy absztrakt osztály absztrakt metódusokkal deklarálható:
TAbstractClass = osztályeljárás NonAbstractProcedure ; _ eljárás AbsztraktEljárás ; absztrakt ; vége ;Létre lehet hozni egy objektumot egy ilyen osztályhoz, de a metódus AbstractProcedurefutási időben történő meghívása hibát okoz.
A Delphi legújabb verzióiban maga az osztály is absztraktnak nyilvánítható:
TAbstractClass = osztály absztrakt eljárás SomeProcedure ; vége ;Bár egy metódus SomeProcedurenem lehet elvont és nem implementálható az adott osztályon belül, illegális az ilyen módon deklarált osztály objektumainak létrehozása.
A C++ nyelvben egy absztrakt osztály legalább egy , típusú tiszta virtuális függvénytvirtual _сигнатура_функции_ =0; tartalmaz , amely másokhoz hasonlóan lecserélhető. Példa C++ programozási nyelven:
#include <iostream> class CA { // Absztrakt osztály public : CA ( void ) { std :: cout << "Az osztály ezen objektuma" ; } virtual void Abstr ( void ) = 0 ; // Tiszta (üres) virtuális függvény. void fun ( void ) { std :: cout << "A megvalósítás nem öröklődik!" ; } ~ CA () { std :: cout << "." << std :: endl ; } //Callod in arr. konstruktorok sorrendje }; osztály CB : public CA { nyilvános : CB ( void ) { std :: cout << "CB;" ; } void Abstr ( void ){ std :: cout << " függvény cb.Abstr();" ; } //Csere függvény. void fun ( void ){ std :: cout << " függvényhívás cb.fun()" ; } ~ CB () {} // Nem igaz az abstr. osztály ~CB(){ ~CA(); } }; class CC : public CA { nyilvános : CC ( void ) { std :: cout << "CC;" ; } void Abstr ( void ) { std :: cout << " függvény cc.Abstr();" ; } //Csere függvény. void fun ( void ) { std :: cout << " függvényhívás cc.fun()" ; } ~ CC () {} // Nem igaz az abstr. osztály ~CC(){ ~CA(); } }; int main () { std :: cout << "Program:" << std :: endl ; CB cb ; cb . abstr (); cb . mulatság (); cb . ~ CB (); CC cc ; cc . abstr (); cc . mulatság (); cc . ~ cc (); return 0 ; }A program eredménye:
Program: Ez a CB osztály objektuma; függvény meghívása cb.abstr(); a cb.fun() függvény meghívása. Ez az objektum a CC osztályból; függvény hívása cc.abstr(); cc.fun() függvény meghívása. . .Az absztrakt módosító azt jelzi, hogy az osztály csak öröklési alaposztályként használható. Az absztrakt osztályok tartalmazhatnak absztrakt metódusokat és elérőket. Egy absztrakt osztály példánya nem hozható létre konstruktor meghívásával, de egy absztrakt osztály példánya implicit módon jön létre, amikor egy származtatott konkrét osztály példányát szerkesztik. Egy absztrakt osztályból származó nem absztrakt osztálynak tartalmaznia kell az összes örökölt absztrakt metódus és hozzáférő tényleges megvalósítását. Ha azt szeretné jelezni, hogy egy metódusban vagy tulajdonságban nincs implementáció, használja az absztrakt módosítót a metóduson vagy tulajdonság deklaráción. Az absztrakt metódus egy implicit virtuális módszer. Az absztrakt tagok (módszerek, tulajdonságok, események) deklarálása csak absztrakt osztályokban és interfészekben megengedett (olyan sztereotípiák, amelyek analógiák a tisztán absztrakt osztályokkal, amelyekben minden megvalósítás tilos). Mivel az absztrakt metódusdeklaráció nem biztosít tényleges megvalósítást, nincs metódustörzs, a metódus deklarációja egyszerűen pontosvesszővel végződik, hasonlóan a prototípus deklarációkhoz:
public abstract void AbstractMethod ();A megvalósítást az override metódus biztosítja, amely a nem absztrakt osztály tagja.
A statikus vagy virtuális módosítók használata absztrakt metódusokban vagy tulajdonságnyilatkozatokban illegális. Az absztrakt tulajdonságok ugyanúgy működnek, mint az absztrakt módszerek, kivéve a deklaráció és a hívás szintaxisának különbségeit. Egy absztrakt örökölt tulajdonság felülbírálható egy származtatott osztályban egy felülbírálási módosítót használó tulajdonság deklarációval.
abstract class BaseClass // Absztrakt osztály { protected int _x = 100 ; védett int _y = 150 ; public abstract void AbstractMethod (); // Absztrakt metódus public abstract int X { get ; } public abstract int Y { get ; } } class DerivedClass : BaseClass { public override void AbstractMethod () { _x ++; _y ++; } public override int X // felülbíráló tulajdonság { get { return _x + 10 ; } } public override int Y // felülbíráló tulajdonság { get { return _y + 10 ; } } static void Main () { DerivedClass o = new DerivedClass (); o . Absztrakt módszer (); Konzol . WriteLine ( "x = {0}, y = {1}" , o . X , o . Y ); } } // Kimenet: x = 111, y = 161Egy absztrakt osztálynak implementációt kell biztosítania az interfész minden tagja számára. Egy interfészt megvalósító absztrakt osztály leképezheti az interfész metódusait absztrakt metódusokra.
interfész I { void M (); } absztrakt osztály C : I { public abstract void M (); }A lezárt módosítóval rendelkező absztrakt osztály nem használható, mert az absztrakt és a lezárt módosítónak kölcsönösen kizáró jelentése van. A lezárt módosító megakadályozza az osztály öröklését, míg az absztrakt módosító azt határozza meg, hogy az osztálynak származtatott osztályokkal kell rendelkeznie.