Mitä eroa on rajapinnan ja abstraktin luokan välillä?

Mitä eroa on rajapinnan ja abstraktin luokan välillä?

Ratkaisu

Liitännät

Rajapinta on sopimus: Henkilö, joka kirjoittaa rajapinnan, sanoo "hei, hyväksyn, että asiat näyttävät tuolta", ja henkilö, joka käyttää rajapintaa, sanoo "OK, kirjoittamani luokka näyttää tuolta".

Liittymä on tyhjä kuori. Siinä on vain metodien allekirjoitukset, mikä tarkoittaa, että metodeilla ei ole runkoa. Rajapinta ei voi tehdä mitään. Se on vain malli.

Esimerkiksi (pseudokoodi):

// 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;
    }
}

Rajapinnan toteuttaminen kuluttaa hyvin vähän prosessoria, koska se ei ole luokka, vaan vain joukko nimiä, ja siksi ei ole mitään kallista etsintää. Se on hienoa silloin, kun sillä on merkitystä, kuten sulautetuissa laitteissa.


Abstraktit luokat

Abstraktit luokat, toisin kuin rajapinnat, ovat luokkia. Niiden käyttö on kalliimpaa, koska niiden periytyessä on tehtävä hakuja.

Abstraktit luokat näyttävät paljon rajapinnoilta, mutta niissä on jotain enemmän: Niille voidaan määritellä käyttäytyminen. Kyse on enemmänkin siitä, että henkilö sanoo: "Tämän luokan pitäisi näyttää tuolta, ja niillä on tuo yhteinen piirre, joten täytä tyhjät kohdat!".

Esimerkiksi:

// 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");
    }
}

Toteutus

Vaikka abstraktien luokkien ja rajapintojen pitäisi olla eri käsitteitä, toteutukset tekevät tästä väitteestä joskus epätoden. Joskus ne eivät edes ole sitä, mitä luulet niiden olevan.

Javassa tätä sääntöä noudatetaan tiukasti, kun taas PHP:ssä rajapinnat ovat abstrakteja luokkia, joissa ei ole ilmoitettu metodeja.

Pythonissa abstraktit luokat ovat enemmänkin ohjelmointitemppu, jonka voi saada ABC-moduulista, ja siinä käytetään itse asiassa metaluokkia ja siten luokkia. Ja rajapinnat liittyvät tässä kielessä enemmän ankkatyypitykseen, ja se'on sekoitus konventioita ja erityisiä metodeja, jotka kutsuvat kuvaajia (__metodi____metodit).

Kuten yleensä ohjelmoinnissa, on teoriaa, käytäntöä ja käytäntöä toisella kielellä :-)

Kommentit (22)

Selitys löytyy täältä:

Abstrakti luokka on luokka, joka on vain osittain toteutettu ohjelmoija. Se voi sisältää yhden tai useamman abstrakteja metodeja. Abstrakti metodi on yksinkertaisesti funktion määritelmä, joka jonka tarkoituksena on kertoa ohjelmoijalle, että toiminto metodi on toteutettava lapsena olevassa luokassa.

Rajapinta on samanlainen kuin abstrakti luokka. luokka; rajapinnat todellakin vievät osan samaa nimiavaruutta kuin luokat ja abstraktit luokat. luokat. Tästä syystä et voi määritellä rajapintaa, jolla on sama nimi. kuin luokan. Rajapinta on täysin abstrakti luokka; mikään sen metodeista ei ole abstrakti. ei ole toteutettu, ja luokan sijasta luokan alaluokan sijasta sen sanotaan olevan toteuttaa kyseisen rajapinnan.

Joka tapauksessa minusta tämä selitys rajapinnoista on hieman hämmentävä. Yleisempi määritelmä on: Rajapinta määrittelee sopimuksen, joka toteuttavien luokkien on täytettävä. Rajapintamääritelmä koostuu julkisten jäsenten allekirjoituksista, ilman mitään toteuttavaa koodia.

Kommentit (3)

Tämä ei oikeastaan ole vastaus alkuperäiseen kysymykseen, mutta kun olet saanut vastauksen niiden väliseen eroon, pääset kysymykseen, milloin käyttää kumpaakin: https://stackoverflow.com/questions/1231985/when-to-use-interfaces-or-abstract-classes-when-to-use-both

Minulla'on rajallinen tietämys OOP:stä, mutta rajapintojen näkeminen kieliopin adjektiivin vastineena on toiminut minulle tähän asti (korjatkaa, jos tämä menetelmä on virheellinen!). Esimerkiksi rajapintojen nimet ovat kuin attribuutteja tai kykyjä, joita voi antaa luokalle, ja luokalla voi olla niitä useita: ISerializable, ICountable, IList, ICacheable, IHappy, ...

Kommentit (0)