Mikä on oikea vastaus, jos kysytään koodaushaastattelussa "mikä on ensisijainen ero rajapinnan ja abstraktin luokan välillä"?


Vastaus 1:

Ihminen elossa, kyllästyin heihin puoli kuoliaaksi.

En todellakaan “tiedä vastausta”, mutta tiedän, mikä on mielipiteeni.

Käytän käyttöliittymiä lupauksena soittaa koodille, mitä se voi odottaa. Se on abstraktio - asia, joka on aina totta, riippumatta siitä, kuinka toteutat sen. Minulle se edustaa (tyypillisesti) sovellusaluetta - aihe.

Viimeisin esimerkki on

käyttöliittymä UserProfiles {
  Valinnainen  -lataus (UUID accountNumber);
}

Kutsuva koodi antaa tilin tunnuksen ja saa profiilin takaisin, jos se on saatavilla.

Sillä on tällä hetkellä pari toteutusta, kun siirrymme järjestelmään. Abstraktista luokasta voi olla apua tässä.

Abstrakti luokka edustaa minulle ”muokattavaa mekanismia”. Se ei ole osa aihetta. Asiakkaan ei pitäisi luottaa siihen tarjoamien palvelujen lupausena.

Se on osa toteutusta. Erityisesti se on yhteinen toteutuskoodi, joka jaetaan rajapinnan kahden tai useamman mahdollisen toteutuksen välillä.

Meillä voi olla abstrakti luokka

abstrakti luokka DatabaseUserProfiles toteuttaa UserProfiles {
  Valinnainen  -lataus (UUID-tilinumero) {
    Merkkijono-tietokantaSpecificSql = getQueryFindByAccountNumber (accountNumber);

    return executeQuery (databaseSpecificSql);
  }

  abstrakti merkkijono getQueryFindByAccountNumber (UUID accountNumber);
}

Tässä kuvitteellisessa esimerkissä meillä olisi pari SQL-tietokantatuotetta, joita tuimme profiilien tallentamisessa, ja käytä GoF-mallipohjaista menetelmää getQueryFindByAccountNumber () palauttamaan tietokantakohtainen SQL.

Yleisen SQL-tietokannan käytön jaetut osat olisivat muualla tässä abstraktissa luokassa.

Joten kyllä, minulla olisi itse asiassa käyttöliittymä - aihe / asiakkaan lupaus - ja ABC (joskus) - jaettu toteutus.

Kaksi erilaista luettavuuden tarkoitusta.

Ja kyllä, koska Java 8/9/10 mikä tahansa, tämä rivi on yhtä epäselvä kuin se oli koskaan C ++: ssa. Vaikka voit käyttää ABC: tä molempiin tarkoituksiin, en halua, koska se ei välitä minun lukijani koodaa mitä haluan sen sanovan.

Tässä vaiheessa me kaikki näytämme hieman tylsistyneiltä ja siirrymme hieman taululle, odotan.


Vastaus 2:

Luulen, että sanoisin, että käyttöliittymä tukee monta perintöä, ja abstrakti luokka ei. Toinen ero on, että kaikkien käyttöliittymän menetelmien on oltava abstrakteja.

Rajapinta on itse asiassa abstraktimpi kuin itse abstrakti luokka. Tarvittaessa voit jopa luoda käyttöliittymän, joka laajentaa useita muita rajapintoja.

Käyttöliittymä on lopullinen abstrakti luokka. Abstrakti luokka on hybridi rajapinnan ja betoniluokan välillä.

Abstrakti luokka voi sisältää konkreettisia menetelmiä, ja siten moninkertainen periminen voi aiheuttaa epäselviä ohitusmenetelmiä konkreettisista menetelmistä, mikä ei ole tilanne abstraktien menetelmien ohitusten kohdalla, koska abstraktit menetelmät ovat tyhjiä, jos se on järkevää, ja siten Java sallii rajapinnoille vain useita perimisiä.

Jos tarkastelet Java-kokoelmien hierarkiaa, näet kuinka rajapinnat tekevät kuvaajasta asyklisen Git-puun muodossa eikä binaarimuodossa, kuten olisi, jos rajapintoja ei käytetä.


Vastaus 3:

Luulen, että sanoisin, että käyttöliittymä tukee monta perintöä, ja abstrakti luokka ei. Toinen ero on, että kaikkien käyttöliittymän menetelmien on oltava abstrakteja.

Rajapinta on itse asiassa abstraktimpi kuin itse abstrakti luokka. Tarvittaessa voit jopa luoda käyttöliittymän, joka laajentaa useita muita rajapintoja.

Käyttöliittymä on lopullinen abstrakti luokka. Abstrakti luokka on hybridi rajapinnan ja betoniluokan välillä.

Abstrakti luokka voi sisältää konkreettisia menetelmiä, ja siten moninkertainen periminen voi aiheuttaa epäselviä ohitusmenetelmiä konkreettisista menetelmistä, mikä ei ole tilanne abstraktien menetelmien ohitusten kohdalla, koska abstraktit menetelmät ovat tyhjiä, jos se on järkevää, ja siten Java sallii rajapinnoille vain useita perimisiä.

Jos tarkastelet Java-kokoelmien hierarkiaa, näet kuinka rajapinnat tekevät kuvaajasta asyklisen Git-puun muodossa eikä binaarimuodossa, kuten olisi, jos rajapintoja ei käytetä.


Vastaus 4:

Luulen, että sanoisin, että käyttöliittymä tukee monta perintöä, ja abstrakti luokka ei. Toinen ero on, että kaikkien käyttöliittymän menetelmien on oltava abstrakteja.

Rajapinta on itse asiassa abstraktimpi kuin itse abstrakti luokka. Tarvittaessa voit jopa luoda käyttöliittymän, joka laajentaa useita muita rajapintoja.

Käyttöliittymä on lopullinen abstrakti luokka. Abstrakti luokka on hybridi rajapinnan ja betoniluokan välillä.

Abstrakti luokka voi sisältää konkreettisia menetelmiä, ja siten moninkertainen periminen voi aiheuttaa epäselviä ohitusmenetelmiä konkreettisista menetelmistä, mikä ei ole tilanne abstraktien menetelmien ohitusten kohdalla, koska abstraktit menetelmät ovat tyhjiä, jos se on järkevää, ja siten Java sallii rajapinnoille vain useita perimisiä.

Jos tarkastelet Java-kokoelmien hierarkiaa, näet kuinka rajapinnat tekevät kuvaajasta asyklisen Git-puun muodossa eikä binaarimuodossa, kuten olisi, jos rajapintoja ei käytetä.