Clasa abstracte

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 16 mai 2020; verificările necesită 12 modificări .

O clasă abstractă în programarea orientată pe obiecte este o clasă de bază care nu necesită instanțiere. Clasele abstracte implementează în practică unul dintre principiile OOP- polimorfism . O clasă abstractă poate conține sau nu [1] ) metode și proprietăți abstracte . O metodă abstractă nu este implementată pentru clasa în care este declarată, ci trebuie implementată pentru descendenții ei non-abstracti. Clasele abstracte sunt cele mai generale abstracții, adică au cel mai mare volum și cel mai mic conținut .

În unele limbi, este interzisă crearea instanțelor de clase abstracte, în altele este permisă (de exemplu, Delphi), dar accesarea metodei abstracte a unui obiect din această clasă în timpul execuției programului va avea ca rezultat o eroare. În multe limbi, este acceptabil să se declare abstract de clasă, chiar dacă nu are metode abstracte (de exemplu, Java), tocmai pentru a interzice instanțierea. O clasă abstractă poate fi gândită ca o interfață cu familia de clase pe care o derivă, dar spre deosebire de o interfață clasică, o clasă abstractă poate avea anumite metode, precum și proprietăți.

Metodele abstracte sunt întotdeauna virtuale , totuși „abstract” și „virtual” sunt concepte diferite.

Exemple

Delphi

În Delphi , o clasă abstractă cu metode abstracte poate fi declarată:

TAbstractClass = procedura de clasă NonAbstractProcedure ; procedura AbstractProcedure ; abstract ; sfârşitul ;

Un obiect poate fi creat pentru o astfel de clasă, dar apelarea unei metode pe AbstractProcedureacel obiect în timpul rulării va cauza o eroare.

În versiunile recente ale Delphi, clasa în sine poate fi, de asemenea, declarată abstractă:

TAbstractClass = procedură abstractă de clasă SomeProcedure ; sfârşitul ;

Deși o metodă SomeProcedurepoate să nu fie abstractă și implementată în cadrul acelei clase, este ilegal să se creeze obiecte ale clasei declarate în acest fel.

C++

În C++ , o clasă abstractă este declarată a conține cel puțin o funcție virtuală pură , de tip virtual _сигнатура_функции_ =0;, care, ca și altele, poate fi înlocuită. Exemplu în limbajul de programare C++:

#include <iostream> clasa CA { // Clasa abstractă public : CA ( void ) { std :: cout << "Acest obiect al clasei" ; } virtual void Abstr ( void ) = 0 ; // Funcție virtuală pură (goală). void fun ( void ) { std :: cout << "Implementarea nu va fi moștenită!" ; } ~ CA () { std :: cout << "." << std :: endl ; } //Apelat în arr. ordinea constructorilor }; clasa CB : public CA { public : CB ( void ) { std :: cout << "CB;" ; } void Abstr ( void ){ std :: cout << " funcția de apelare cb.Abstr();" ; } //Funcția de înlocuire. void fun ( void ){ std :: cout << " call function cb.fun()" ; } ~ CB () {} // Nu este adevărat pentru abstr. clasă ~CB(){ ~CA(); } }; clasa CC : public CA { public : CC ( void ) { std :: cout << "CC;" ; } void Abstr ( void ) { std :: cout << " funcția de apelare cc.Abstr();" ; } //Funcția de înlocuire. void fun ( void ) { std :: cout << " call function cc.fun()" ; } ~ CC () {} // Nu este adevărat pentru abstr. clasă ~CC(){ ~CA(); } }; int main () { std :: cout << "Program:" << std :: endl ; CB cb ; cb . abstr (); cb . distracție (); cb . ~ CB (); CC cc ; cc . abstr (); cc . distracție (); cc . ~ cc (); returnează 0 ; }

Rezultatul programului:

Program: Acest obiect al clasei CB; funcția de apel cb.abstr(); apelați funcția cb.fun(). Acest obiect al clasei CC; funcția de apel cc.abstr(); apelați funcția cc.fun(). . .

C#

Modificatorul abstract indică faptul că clasa poate fi folosită doar ca clasă de bază pentru moștenire. Clasele abstracte pot conține metode abstracte și accesorii. O instanță a unei clase abstracte nu poate fi creată prin apelarea unui constructor, dar o instanță a unei clase abstracte este creată implicit atunci când este construită o instanță a unei clase concrete derivate. O clasă non-abstractă care derivă dintr-o clasă abstractă trebuie să conțină implementările reale ale tuturor metodelor și accesoriilor abstracte moștenite. Pentru a indica faptul că nu există nicio implementare într-o metodă sau proprietate, utilizați modificatorul abstract pe declarația metodei sau a proprietății. O metodă abstractă este o metodă virtuală implicită. Declarațiile membrilor abstracti (metode, proprietăți, evenimente) sunt permise numai în clase și interfețe abstracte (stereotipuri care sunt analoge claselor abstracte pure în care orice implementare este interzisă). Deoarece o declarație de metodă abstractă nu oferă o implementare reală, nu există un corp de metodă, declarația de metodă se termină pur și simplu cu punct și virgulă, similar declarațiilor prototip:

public abstract void AbstractMethod ();

Implementarea este asigurată de metoda override, care este membră a clasei non-abstracte.

Utilizarea modificatorilor statici sau virtuali într-o metodă abstractă sau într-o declarație de proprietate este ilegală. Proprietățile abstracte funcționează în același mod ca metodele abstracte, cu excepția diferențelor de declarare și de sintaxa de apel. O proprietate abstractă moștenită poate fi suprascrisă într-o clasă derivată prin includerea unei declarații de proprietate care utilizează un modificator de suprascriere.

abstract class BaseClass // Abstract class { protected int _x = 100 ; protejat int _y = 150 ; public abstract void AbstractMethod (); // Metoda abstractă public abstract int X { get ; } public abstract int Y { get ; } } class DerivedClass : BaseClass { public override void AbstractMethod () { _x ++; _y ++; } public override int X // suprascriind proprietatea { get { return _x + 10 ; } } public override int Y // suprascriind proprietatea { get { return _y + 10 ; } } static void Main () { DerivedClass o = new DerivedClass (); o . AbstractMethod (); Consola . WriteLine ( "x = {0}, y = {1}" , o . X , o . Y ); } } // Ieșire: x = 111, y = 161

O clasă abstractă trebuie să ofere o implementare pentru toți membrii unei interfețe. O clasă abstractă care implementează o interfață poate mapa metode de interfață la metode abstracte.

interfață I { void M (); } abstract class C : I { public abstract void M (); }

O clasă abstractă cu modificatorul sigilat nu poate fi utilizată deoarece modificatorii abstract și sigilați au semnificații care se exclud reciproc. Modificatorul sigilat previne moștenirea clasei, în timp ce modificatorul abstract specifică faptul că clasa trebuie să aibă clase derivate.

Note

  1. Metode și clase abstracte (Tutorialele Java™ > Învățarea limbajului Java > Interfețe și moștenire) . Data accesării: 30 septembrie 2010. Arhivat din original la 2 august 2010.

Vezi și

Literatură

  • Podbelsky VV Capitolul 10.3 Funcții virtuale și clase abstracte \\ Clase abstracte. // Limbajul C++ / rec. Dadaev Yu. G. - 4. - M .: Finanțe și statistică , 2003. - P. 365-373. — 560 p. - ISBN 5-279-02204-7 , UDC 004.438Si (075.8) LBC 32.973.26-018 1ya173.