Lisää
Mitä eroa on rajapinnan ja abstraktin luokan välillä?
Mitä eroa on rajapinnan ja abstraktin luokan välillä?
1699
3
Mitä eroa on rajapinnan ja abstraktin luokan välillä?
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):
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:
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ä :-)
Selitys löytyy täältä:
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.
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, ...