Diferența dintre virtuală și abstractă

Virtual vs. Rezumat

Virtual și Abstract sunt două cuvinte cheie utilizate în majoritatea limbajelor de programare orientate pe obiecte (OO), cum ar fi Java și C #. Deși există diferențe mici în ceea ce înseamnă în diferite limbi, atât cuvintele cheie virtuale, cât și cele Abstract vă oferă un sentiment de implementare parțială a entităților pe care le atașează.

Abstract

În mod tipic, clasele Abstract, cunoscute și sub denumirea de Abstract Base Classes (ABC), nu pot fi instanțiate (nu poate fi creată o instanță a acelei clase). Deci, clasele Rezumat sunt semnificative doar dacă limbajul de programare suportă moștenirea (abilitatea de a crea subclase din extinderea unei clase). Clasele abstracte reprezintă, de obicei, un concept sau o entitate abstractă cu implementare parțială sau lipsită. Prin urmare, clasele abstracte acționează ca clase de părinți din care derivă clasele copil, astfel încât clasa copil va împărtăși caracteristicile incomplete ale clasei părinte și funcționalitatea poate fi adăugată pentru a le completa. Clasele abstracte pot conține metode Abstract. Subclasele care extind o clasă abstractă pot implementa aceste metode (moștenite) Abstract. Dacă clasa copil implementează toate aceste metode Abstract, este o clasă concretă. Dar dacă nu, clasa copil devine și o clasă abstractă. Ce înseamnă acest lucru este că, atunci când programatorul numește o clasă ca un Rezumat, ea spune că clasa va fi incompletă și va avea elemente care trebuie completate de subclasele de moștenire. Aceasta este o modalitate frumoasă de a crea un contract între doi programatori, care simplifică sarcinile în dezvoltarea de software. Programatorul, care scrie codul pentru a moșteni, trebuie să urmeze exact definițiile metodei (dar, desigur, poate avea propria implementare). În Java și C #, clasele și metodele Abstract sunt declarate folosind cuvântul cheie abstract.

Virtual

Metodele / funcțiile virtuale oferă posibilitatea de a suprascrie opțional comportamentul său printr-o clasă de moștenire (folosind o funcție cu aceeași semnătură). Conceptul funcției virtuale este important în următorul scenariu. Să presupunem că o clasă este derivată de la o clasă copil, atunci când se utilizează un obiect al clasei derivate, se poate referi la un obiect al clasei de bază sau al clasei derivate. Dar, comportamentul apelului metodei poate fi ambiguuos dacă metodele de clasă de bază sunt suprasolicitate. Deci, pentru a rezolva această ambiguitate, este folosit cuvântul cheie virtual. Dacă metoda este marcată Virtual, atunci funcția clasei derivate este apelată (dacă există) sau altfel se numește funcția clasei de bază. De exemplu, în C ++, cuvântul cheie virtual este utilizat exact în acest scop. În C #, cuvântul cheie virtual este utilizat într-un mod similar, dar în plus, suprascrierea cuvântului cheie ar trebui utilizată pentru a modifica toate metodele suprasolicitate. Dar în Java, nu există un cuvânt cheie explicit explicit. Toate metodele non-statice sunt considerate Virtual. Funcțiile virtuale fără corp sunt numite funcții Virtuale Pure. În Java și C #, metodele Abstract sunt de fapt Pure Virtual.

Diferența dintre Virtual și Rezumat

Deși Abstract și Virtual sunt două cuvinte cheie / concepte care oferă o semnificație a implementării incomplete entităților asociate, ele au diferențele. Metodele abstract (care trebuie definite în clasele Abstract) nu au o implementare deloc, în timp ce metodele virtuale pot avea o implementare. Dacă metodele Abstract sunt extinse printr-o clasă concretă, toate metodele Abstract moștenite trebuie să fie implementate, în timp ce metodele virtuale moștenite pot sau nu să fie suprimate.