Care este diferența dintre o interfață și o clasă abstractă?

Care este exact diferența dintre o interfață și o clasă abstractă?

Soluția

Interfețe

O interfață este un contract: Persoana care scrie interfața spune, "hei, accept ca lucrurile să arate așa", iar persoana care folosește interfața spune "OK, clasa pe care o scriu arată așa".

O interfață este o cochilie goală. Există doar semnăturile metodelor, ceea ce implică faptul că metodele nu au un corp. Interfața nu poate'face nimic. Este doar un model.

De exemplu (pseudocod):

// I say all motor vehicles should look like this:
interface MotorVehicle
{
    void run();

    int getFuel();
}

// My team mate complies and writes vehicle looking that way
class Car implements MotorVehicle
{

    int fuel;

    void run()
    {
        print("Wrroooooooom");
    }

    int getFuel()
    {
        return this.fuel;
    }
}

Implementarea unei interfețe consumă foarte puțin procesor, deoarece nu este o clasă, ci doar o grămadă de nume și, prin urmare, nu este nevoie de căutări costisitoare. Este excelent atunci când contează, cum ar fi în cazul dispozitivelor integrate.


Clase abstracte

Clasele abstracte, spre deosebire de interfețe, sunt clase. Utilizarea lor este mai costisitoare, deoarece trebuie să se facă o căutare atunci când se moștenește din ele.

Clasele abstracte seamănă foarte mult cu interfețele, dar au ceva în plus: Puteți defini un comportament pentru ele. Este vorba mai mult despre o persoană care spune: "aceste clase ar trebui să arate așa, și au asta în comun, așa că completați spațiile goale!".

De exemplu:

// I say all motor vehicles should look like this:
abstract class MotorVehicle
{

    int fuel;

    // They ALL have fuel, so lets implement this for everybody.
    int getFuel()
    {
         return this.fuel;
    }

    // That can be very different, force them to provide their
    // own implementation.
    abstract void run();
}

// My teammate complies and writes vehicle looking that way
class Car extends MotorVehicle
{
    void run()
    {
        print("Wrroooooooom");
    }
}

Implementare

În timp ce clasele abstracte și interfețele ar trebui să fie concepte diferite, implementările fac ca această afirmație să fie uneori neadevărată. Uneori, ele nici măcar nu sunt ceea ce credeți că sunt.

În Java, această regulă este puternic aplicată, în timp ce în PHP, interfețele sunt clase abstracte fără metode declarate.

În Python, clasele abstracte sunt mai mult un truc de programare pe care îl puteți obține din modulul ABC și este de fapt utilizarea metaclaselor și, prin urmare, a claselor. Iar interfețele sunt mai mult legate de tipărirea ratelor în acest limbaj și este un amestec între convenții și metode speciale care apelează descriptori (metodele __metode___).

Ca de obicei cu programarea, există teorie, practică și practică în alt limbaj :-)

Comentarii (22)

O explicație poate fi găsită aici:

O clasă abstractă este o clasă care este implementată doar parțial de către programator. Ea poate conține una sau mai multe metode abstracte. O metodă abstractă este pur și simplu o definiție a unei funcții care servește pentru a spune programatorului că funcția trebuie să fie implementată într-o metodă copil. clasă.

O interfață este similară cu o clasă abstractă. clasă abstractă; într-adevăr, interfețele ocupă locul același spațiu de nume ca și clasele și clasele abstracte. clase. Din acest motiv, nu puteți defini o interfață cu același nume ca o clasă. O interfață este o interfață complet clasă abstractă; niciuna dintre metodele sale nu este sunt implementate și în locul unei clase subclasa din ea, se spune că este vorba de implementează acea interfață.

Oricum, consider că această explicație a interfețelor este oarecum confuză. O definiție mai obișnuită este: O interfață definește un contract pe care clasele care o implementează trebuie să îl îndeplinească. Definiția unei interfețe constă în semnăturile membrilor publici, fără niciun cod de implementare.

Comentarii (3)

Nu este chiar răspunsul la întrebarea inițială, dar odată ce aveți răspunsul la diferența dintre ele, veți intra în dilema când să folosiți fiecare: https://stackoverflow.com/questions/1231985/when-to-use-interfaces-or-abstract-classes-when-to-use-both

Am cunoștințe limitate despre OOP, dar considerând interfețele ca fiind echivalentul unui adjectiv în gramatică a funcționat pentru mine până acum (corectați-mă dacă această metodă este falsă!). De exemplu, numele interfețelor sunt ca niște atribute sau capabilități pe care le poți da unei clase, iar o clasă poate avea mai multe: ISerializable, ICountable, IList, ICacheable, IHappy, ...

Comentarii (0)