Mikä on ohjelmoinnin rajapintojen ydin?

PHP OOP:ssa käyttöliittymä on luokka, jossa kaikki menetelmät ovat abstrakteja ja julkisia.

Käydään nopeasti läpi tässä määritelmässä käytetyt kolme termiä. Luokka, abstrakti ja avoin. Luokka on objektin malli tai malli, ja se on olio-ohjelmoinnin perusta. Abstrakti menetelmä on erityinen menetelmä, joka on ilmoitettu, mutta jolla ei ole runkoa, vain tyhjät sulut. Julkinen on julkisen pääsyn muokkaaja ja liittyy menetelmien käyttöoikeuksiin. Tämä tarkoittaa, että se on käytettävissä mistä tahansa: tästä luokasta, sen ulkopuolelta ja mistä tahansa johdetuista luokista.

PHP-rajapinta on työkalu vahvan koodin luomiseen, joka määrittelee luokan toteuttamat menetelmät määrittelemättä näiden menetelmien käsittelyä. Tämä on tehokas ja yksinkertainen konsepti, jota käytetään oliopohjaisessa PHP:ssä. Sen luomiseen käytetään sitä avainsana käyttöliittymä , se määritellään samalla tavalla kuin PHP luokka. Sen sisältämät menetelmät eivät ole toiminnallisia, mutta käyttöliittymä määrittelee, mitä menetelmiä muut luokat tarvitsevat. Jokaisen rajapinnalta perivän luokan on sisällettävä samat menetelmät kuin rajapinnassa, muuten tulee virheilmoitus.

PHP OOP -rajapinnassa määritetään vain menetelmien nimet ja niiden parametrit, ja ne voidaan toteuttaa myöhemmin. On tapana ilmoittaa kaikki käyttöliittymämenetelmät julkisiksi. Toteuttaaksesi käyttöliittymän, käytä implements-avainsanaa. Tarvittaessa luokka voi toteuttaa useamman kuin yhden rajapinnan, ne erotetaan pilkulla. Kuten luokka, käyttöliittymä voi sisältää vakioita. Ainoa ero on, että niitä ei voi ohittaa johdetuissa luokassa.

Liitäntöjen määrittely ja käyttö

Käyttöliittymä määritellään käyttöliittymäavainsanalla. Kaikkien siinä olevien menetelmien on oltava julkisia ja abstrakteja:

käyttöliittymäeläin ( )

Tämä on tyhjä käyttöliittymä. Lisäämme siihen abstraktin liikemenetelmän. Joten luomme yksinkertainen PHP 5 OOP-rajapinta, joka voidaan ottaa käyttöön myöhemmin:

käyttöliittymäeläin ( julkinen toiminto liike()() )

Tämän rajapinnan voi toteuttaa mikä tahansa eläinluokka, kaikki eläinluokat sisältävät liikemenetelmän. Katsotaanpa esimerkkiä. Käyttöliittymän toteuttamiseen käytämme implements-avainsanaa:

PHP-käyttöliittymä ja abstraktit luokat

Liitännät ja abstraktit luokat ovat käsitteeltään hyvin samankaltaisia. Ne auttavat luomaan malleja luokille, joita käytetään sovelluksessa. PHP OOP:n perusteiden mukaan ne eroavat toisistaan ​​seuraavasti:

  1. Käyttöliittymässä kaikki menetelmät ovat abstrakteja (ilman toteutusta). Abstraktissa luokassa vain jotkut menetelmät ovat abstrakteja. Abstraktin luokan tulee sisältää vähintään, yksi abstrakti menetelmä. Muuten se on tavallinen PHP-luokka;
  2. PHP-rajapinnassa kaikki ilmoitetut menetelmät ovat julkisia, kun taas abstraktissa luokassa menetelmät voivat olla julkisia, yksityisiä tai suojattuja. Siksi rajapinnoilla on rajoitus pääsyn muokkaajien käytölle, mutta abstraktilla luokalla ei ole tällaisia ​​rajoituksia;
  3. Luokka voi toteuttaa rajattoman määrän rajapintoja. Samanaikaisesti PHP-luokka voi luoda vain yhden abstraktin luokan;
  4. Sinun on ohitettava kaikki käyttöliittymämenetelmät, mutta abstraktissa luokassa sinulla on vaihtoehto: ohittaa menetelmät tai jättää ne ennalleen;
  5. Liitännöillä on tiukemmat säännöt kuin abstrakteilla luokilla. PHP-käyttöliittymä on suunniteltu tarjoamaan tiettyä logiikkaa, se toimii tyhjänä kääreenä tai mallina muille luokille.

Mihin PHP-liittymiä käytetään?

Käyttöliittymä auttaa ohjelmoijaa ajattelemaan oikeaan suuntaan. PHP OOP:n näkökulmasta luokka on malli ja objekti on joukko ominaisuuksia. Olemme enemmän huolissamme toiminnallisuudesta, siitä, mitä se tekee, eikä siitä, miten se tekee sen. Joten määrittelemme perusrajapinnan, joka on yleinen ja sitten se toteutetaan, mikä auttaa ajattelemaan oikeaan suuntaan.

Tulevat koodisäädöt

Kehittymällä oliopohjaisessa PHP:ssä voit muokata koodia tulevaisuudessa vaikuttamatta päätoimintoihin. Koodia kirjoitettaessa jatkossa nämä ominaisuudet otetaan aina huomioon ja otetaan sitten mukaan lisätoimintoja, mutta tällä ei ole vaikutusta olemassa olevien objektien perusominaisuuksiin.

Parempi ohjelmarakenne

Oliopohjainen PHP on otettu käyttöön rakenteen parantamiseksi luotuja sovelluksia. Liitäntöjen lisääminen PHP:hen tekee koodauksesta siistiä ja puhdasta. Liitännät estävät sinua kirjoittamasta koodia, jota on vaikea ylläpitää ja muuttaa. Liitäntöjen avulla voimme helposti ylläpitää ja muokata koodia, mikä tekee ohjelmoijista tehokkaampia.

Lisää kaikki tärkeät ominaisuudet

PHP-rajapintojen avulla voimme luoda perustoimintoja, jotka voidaan määritellä erilaisia ​​esineitä eri tavoilla ja lisää sitten muita ominaisuuksia tarpeen mukaan.

Toinen OOP PHP esimerkki käyttöliittymän toteutuksesta

luokka Cake toteuttaa Resepti ( julkisen funktion metodologia() ( ) )

Tässä koodissa näemme Cake-luokan, joka toteuttaa Resepti-rajapinnan.

Artikkelin “PHP-käyttöliittymä” käännöksen on valmistellut ystävällinen projektitiimi.

OOP-rajapinnan kuvaus, jos jätämme huomiotta tiettyjen kielten syntaksin yksityiskohdat, koostuu kahdesta osasta:

  • Nimi rajapinta, joka on rakennettu samojen sääntöjen mukaan kuin muut käytetyn ohjelmointikielen tunnisteet. Eri kieliä ja kehitysympäristöissä on erilaiset koodin muotoilukäytännöt, joiden mukaan rajapintojen nimet voidaan muodostaa tiettyjen sääntöjen mukaan, mikä helpottaa rajapinnan nimen erottamista muiden ohjelmaelementtien nimistä. Esimerkiksi sisään COM-tekniikat ja kaikki sitä tukevat kielet, on olemassa käytäntö, jonka mukaan käyttöliittymän nimi rakennetaan mallin "I<Имя>", eli se koostuu kirjoitetusta iso kirjain merkityksellinen nimi, jota edeltää iso kirjain latinalainen kirjain I (IUnknown, IDispatch, IStringList ja niin edelleen).
  • menetelmät käyttöliittymä. Käyttöliittymäkuvaus määrittelee siihen sisältyvien menetelmien eli luokan proseduurien tai funktioiden nimet ja allekirjoitukset.

Liitäntöjä voidaan käyttää kahdella tavalla:

  • luokka voi toteuttaa käyttöliittymä. Käyttöliittymän toteutus on luokan kuvauksen mukainen tämä käyttöliittymä on merkitty toteutettaviksi, ja luokkakoodissa kaikki rajapinnassa kuvatut menetelmät on välttämättä määritelty täysin tämän rajapinnan kuvauksen allekirjoitusten mukaisesti. Eli jos luokka toteuttaa rajapinnan, kaikki rajapinnassa kuvatut menetelmät ovat olemassa ja niitä voidaan kutsua mille tahansa tämän luokan ilmentymälle. Yksi luokka voi toteuttaa useita rajapintoja samanaikaisesti.
  • Muuttujat ja menetelmäparametrit voidaan ilmoittaa liitäntätyyppisiksi. Tällaiseen muuttujaan tai parametriin voidaan kirjoittaa minkä tahansa luokan ilmentymä, joka toteuttaa rajapinnan. Jos rajapinta on ilmoitettu funktion palautustyypiksi, tämä tarkoittaa, että funktio palauttaa liittymän toteuttavan luokan objektin.

Tyypillisesti olio-ohjelmointikielissä rajapinnat, kuten luokat, voivat periytyä toisiltaan. Tässä tapauksessa lapsirajapinta sisältää kaikki esi-isärajapinnan menetelmät ja mahdollisesti lisää niihin omansa.

Joten toisaalta käyttöliittymä on sopimus, jonka luokka suostuu toteuttamaan. täytäntöönpanosta toisaalta sen käyttöliittymä on tietotyyppi, koska sen kuvaus määrittelee riittävän selkeästi objektien ominaisuudet, jotta muuttujat voidaan kirjoittaa luokan tasolle. On kuitenkin syytä korostaa, että rajapinta ei ole täysi tietotyyppi, koska se määrittelee vain objektien ulkoisen käyttäytymisen. Sisäinen rakenne ja rajapinnan määrittelemän käyttäytymisen toteuttamisen tarjoaa luokka, joka toteuttaa rajapinnan; siksi "rajapinnan esiintymät". puhdas muoto ei ole olemassa, ja mikä tahansa "rajapinta"-tyyppinen muuttuja sisältää konkreettisia luokkia.

Rajapintojen käyttö on yksi vaihtoehdoista polymorfismin tarjoamiseksi objektikielissä ja ympäristöissä. Kaikki luokat, jotka toteuttavat saman rajapinnan sen määrittelemän käyttäytymisen suhteen, käyttäytyvät ulkoisesti samalla tavalla. Näin voit kirjoittaa yleisiä tietojenkäsittelyalgoritmeja, jotka käyttävät rajapintoja parametrityypeinä ja soveltavat niitä objekteihin erilaisia ​​tyyppejä, saat vaaditun tuloksen joka kerta.

Esimerkiksi käyttöliittymä "Cloneable" voisi kuvata kloonauksen abstraktiota (luomista tarkat kopiot) -objekteja määrittämällä "Klooni"-menetelmän, jonka pitäisi kopioida objektin sisältö toiseen samantyyppiseen objektiin. Sitten minkä tahansa luokan, jonka objektit on mahdollisesti kopioitava, tulee toteuttaa Cloneable-rajapinta ja tarjota Clone-menetelmä, ja missä tahansa ohjelmassa, jossa objektien kloonaus vaaditaan, Clone-menetelmää kutsutaan objektiin tätä tarkoitusta varten. Lisäksi tätä menetelmää käyttävällä koodilla on oltava vain käyttöliittymän kuvaus, sillä se ei välttämättä tiedä mitään varsinaisesta luokasta, jonka objektit kopioidaan. Näin ollen käyttöliittymät mahdollistavat jakamisen ohjelmistojärjestelmä moduuleiksi ilman keskinäistä koodiriippuvuutta.

Käyttöliittymät ja abstraktit luokat

Saatat huomata, että käyttöliittymä on itse asiassa vain puhdas abstrakti luokka, eli luokka, jossa ei ole määritelty mitään muuta kuin abstrakteja menetelmiä. Jos ohjelmointikieli tukee useita periytyviä ja abstrakteja menetelmiä (kuten C++), ei ole tarvetta ottaa käyttöön erillistä "rajapinnan" käsitettä. Samanlaisia ​​kokonaisuuksia kuvataan abstrakteiksi luokiksi, ja luokat perivät ne abstraktien menetelmien toteuttamiseksi.

Moniperinnön täysi tukeminen on kuitenkin melko monimutkaista ja aiheuttaa monia ongelmia sekä kielen toteutustasolla että sovellusarkkitehtuurin tasolla. Liitäntöjen käsitteen esittely on kompromissi, jonka avulla voit saada monia moniperinnön etuja toteuttamatta sitä kokonaan ja siten kohtaamatta suurinta osaa sen aiheuttamista vaikeuksista.

Useita perintö- ja käyttöliittymätoteutuksia

Tyypillisesti ohjelmointikielet mahdollistavat käyttöliittymän perimisen useilta esi-isiltä. Kaikista esi-isien liitännöissä ilmoitetuista menetelmistä tulee osa jälkeläisrajapinnan ilmoitusta. Toisin kuin luokkaperintö, usean rajapinnan periytyminen on paljon yksinkertaisempaa toteuttaa eikä aiheuta merkittäviä vaikeuksia.

Kuitenkin yksi törmäys moninkertainen perintö rajapintoja ja toteutettaessa useita rajapintoja yhdellä luokalla on edelleen mahdollista. Se tapahtuu, kun kahdella tai useammalla uuden rajapinnan perimällä tai luokan toteuttamalla rajapinnalla on menetelmiä, joilla on samat allekirjoitukset. Ohjelmointikielten kehittäjät joutuvat tällaisissa tapauksissa valitsemaan yksi tai toinen menetelmä ristiriitojen ratkaisemiseksi. Tässä on useita vaihtoehtoja:

  • Kieltää. On yksinkertaisesti kiellettyä toteuttaa useita rajapintoja samassa luokassa, joilla on samat allekirjoitukset. Jos luokka vaatii yhteensopimattomien liitäntöjen yhdistelmän, ohjelmoijan on valittava toinen tapa ratkaista ongelma, esimerkiksi valita useita luokkia, joista jokainen toteuttaa jonkin tarvittavat rajapinnat ja käyttää niiden esiintymiä yhdessä.
  • Selkeän epäselvyyden ratkaisu. Jos kääntäjä havaitsee törmäyksen, ohjelmoijan on nimenomaisesti ilmoitettava, mitä rajapintamenetelmää hän toteuttaa ja kutsuu. Eli samannimiset menetelmät toteutetaan erikseen, ja kun niitä kutsutaan, ilmoitetaan, kumpaa niistä kutsutaan. Tämän ratkaisun muunnelma on eksplisiittinen uudelleennimeäminen samannimisille perityille tai toteutetuille menetelmille, jonka vuoksi toteutusluokassa ei ole samannimistä menetelmiä, mutta rajapinnan kautta käytettäessä vaadittu toteutus kutsutaan aina.
  • Samannimisen menetelmien yleinen toteutus. Jos useita samalla allekirjoituksella varustettuja menetelmiä peritään tai toteutetaan, ne yhdistetään periytyvässä rajapinnassa ja toteutusluokassa ne saavat yhden yleinen toteutus. Tämä on hyvä tapauksiin, joissa menetelmät ovat samannimiset erilaisia ​​käyttöliittymiä toiminnaltaan identtinen, mutta voi aiheuttaa ei-toivottuja vaikutuksia jos näiden menetelmien käyttäytymisen pitäisi olla erilainen.

Liitännät tietyillä kielillä ja järjestelmillä

Liitäntöjen toteutus on pitkälti määrätty alkuperäiset valmiudet kieli ja tarkoitus, jota varten rajapinnat tuodaan siihen. Delphi-järjestelmän C++-, Java- ja Object Pascal -kielten rajapintojen käyttöominaisuudet ovat hyvin suuntaa antavia, koska ne osoittavat kolme olennaisesti erilaista tilannetta:

  • Object Pascal -kielen objektialijärjestelmässä ei ollut rajapintoja. Niiden tuki otettiin käyttöön Delphi 2:ssa COM-komponenttien kirjoittamisen ja käytön mahdollistamiseksi. Vastaavasti mekanismi Delphi käyttöliittymät keskittyi ensisijaisesti COM-tekniikan käyttöön.
  • Javassa käyttöliittymät sisältyvät alun perin kieleen ja ovat kiinteä osa sitä.
  • Tarkkaan ottaen C++:ssa ei ole rajapintoja ollenkaan. Tämän kielen erittäin tehokkaan objektialijärjestelmän muilla keinoin toteutetaan samanlainen mekanismi kuin (ja historiallisesti edeltäneet) rajapinnat.

Delfoi

COM:ssa Delphi-tekniikat muistuttavat luokkia. Kuinka kaikki luokat ovat luokan jälkeläisiä

Esimerkki käyttöliittymän ilmoituksesta:

IMyInterface = käyttöliittymämenettely DoSomething; loppu;

Rajapintojen toteutuksen ilmoittamiseksi luokan kuvauksessa niiden nimet on ilmoitettava suluissa luokka-avainsanan jälkeen, esi-isäluokan nimen jälkeen. Koska käyttöliittymä on sopimus, joka on suoritettava, ohjelma ei käännä ennen kuin proseduuri DoSomething on toteutettu toteutusluokassa;

Edellä mainittu Delphi-rajapintojen keskittyminen COM-tekniikkaan johti joitain haittoja. Tosiasia on, että IUnknown-rajapinta (josta kaikki muut rajapinnat perivät) sisältää jo kolme menetelmää: QueryInterface,_AddRef, _Release, joten mikä tahansa luokka, joka toteuttaa minkä tahansa rajapinnan, vaaditaan näiden menetelmien toteuttamiseen, vaikka käyttöliittymällä ja luokalla ei olisi mitään tehdä COM:n kanssa.

Esimerkki luokasta, joka toteuttaa rajapinnan

TMyClass = class(TMyParentClass, IMyInterface) -menettely DoSomething; function QueryInterface(const IID: TGUID; out Obj) : HResult; stdcall ; toiminto _AddRef: Kokonaisluku ; stdcall ; function _Release: Integer ; stdcall ; loppu;

C++

Java

Liitäntöjen ilmoittaminen

Liittymien ilmoittaminen on hyvin samanlaista kuin luokkailmoitusten yksinkertaistaminen.

Se alkaa otsikolla. Ensin määritetään muuntajat. Käyttöliittymä voidaan julistaa julkiseksi ja sitten se on kaikkien käytettävissä yleinen käyttö, tai pääsyn muokkaajaa ei ehkä ole määritetty, jolloin käyttöliittymä on käytettävissä vain sen pakettityypeille. Abstraktia rajapintaa ei vaadita, koska kaikki rajapinnat ovat abstrakteja. Voit määrittää sen, mutta sitä ei suositella, jotta koodi ei sotkeudu.

Tätä voi seurata extens-avainsana ja luettelo liitännöistä, joista ilmoitettu käyttöliittymä perii. Vanhempatyyppejä voi olla monia, pääasia, että toistoja ei ole ja että periytymissuhde ei muodosta syklistä riippuvuutta.

Käyttöliittymän periytyminen on todellakin erittäin joustavaa. Joten jos on kaksi rajapintaa, A ja B, joiden B perii A:lta, niin uusi käyttöliittymä C voi periä molemmilta. On kuitenkin selvää, että A:n periytymisen osoittaminen on ylimääräistä, kaikki tämän rajapinnan elementit peritään jo rajapinnan B kautta.

Julkisen käyttöliittymän ohjeet ( int OIKEA=1; int VASEN=2; int YLÖS=3; int ALAS=4; )

Kaikki käyttöliittymämenetelmät ovat julkisia abstrakteja, ja nämä modifioinnit ovat myös valinnaisia.

Julkinen käyttöliittymä Moveable ( void moveRight(); void moveLeft(); void moveUp(); void moveDown(); )

Kuten näemme, käyttöliittymän kuvaaminen on paljon yksinkertaisempaa kuin luokan ilmoittaminen.

Käyttöliittymän toteutus

Rajapinnan toteuttamiseksi se on määritettävä, kun luokka määritellään implements-avainsanalla. Esimerkki:

Liitäntä I ( void interfaceMethod() ; ) public luokka ToteutusInterface toteuttaa I ( void interfaceMethod() ( System .out .println ( "Tämä menetelmä on toteutettu käyttöliittymästä I") ; ) public static void main(String args) ( ImplementingInterface temp = new ImplementingInterface() ; temp.interfaceMethod () ; ) )

Jokainen luokka voi toteuttaa minkä tahansa käytettävissä olevat rajapinnat. Tässä tapauksessa luokan tulee toteuttaa kaikki abstraktit menetelmät, jotka ilmestyivät periytyessään liitännöistä tai pääluokasta, jotta uusi luokka voidaan julistaa ei-abstraktiksi.

Jos alkaen eri lähteistä Saman allekirjoituksen omaavat menetelmät periytyvät, silloin riittää, että kuvataan toteutus kerran ja sitä käytetään kaikissa näissä menetelmissä. Jos niillä on kuitenkin eri palautusarvo, syntyy ristiriita. Esimerkki:

Liitäntä A ( int getValue() ; ) liitäntä B ( double getValue() ; ) liitäntä C ( int getValue() ; ) julkinen luokka Oikea toteuttaa A, C // luokka perii oikein menetelmät samalla allekirjoituksella( int getValue() ( return 5 ; ) ) luokka Väärät toteuttaa A, B // luokka aiheuttaa käännösvirheen( int getValue() ( return 5 ; ) double getValue() ( paluu 5.5 ; ) )

) on semanttinen ja syntaktinen rakennelma ohjelmakoodissa, jota käytetään tai tarjoamiin palveluihin.

Liitännät Delphissä

Liitännät C++:ssa

Rajapintojen roolia C++:ssa suorittavat abstraktit luokat.

Javan käyttöliittymät

Liitäntöjen ilmoittaminen

Liittymien ilmoittaminen on hyvin samanlaista kuin luokkailmoitusten yksinkertaistaminen.

Se alkaa otsikolla. Ensin määritetään muuntajat. Rajapinta voidaan julistaa julkiseksi, jolloin se on julkisessa käytössä, tai pääsyn muokkaajaa ei voida määrittää, jolloin rajapinta on vain pakettinsa käytettävissä. abstrakti muuntaja käyttöliittymää ei vaadita, koska kaikki liitännät ovat . Voit määrittää sen, mutta sitä ei suositella, jotta se ei sotke .

Tätä voi seurata avainsana extends ja rajapinnat, joista ilmoitettu käyttöliittymä tulee. Vanhempatyyppejä voi olla monia, pääasia, että toistoja ei ole ja että perinnöllisyyssuhde ei muodosta riippuvuutta.

Käyttöliittymän periytyminen on todellakin erittäin joustavaa. Joten jos on kaksi rajapintaa, A ja B, ja B perii A:lta, uusi rajapinta C voi periä molemmista. On kuitenkin selvää, että A:n periytymisen osoittaminen on ylimääräistä, kaikki tämän rajapinnan elementit peritään jo rajapinnan B kautta.

Sitten sisään aaltosulkeet käyttöliittymä on tallennettu.

Julkinen käyttöliittymä Drawble laajentaa värillistä, kokoa muutettava ( )

Käyttöliittymän runko koostuu ilmoituksesta eli abstrakteista menetelmistä. Kaikkien käyttöliittymäkenttien on oltava julkisia lopullinen staattinen, joten näiden muokkaajien määrittäminen ei ole välttämätöntä ja jopa ei-toivottavaa, jotta . Koska kentät on ilmoitettu, ne on alustettava välittömästi.

Julkisen käyttöliittymän ohjeet ( int OIKEA=1; int VASEN=2; int YLÖS=3; int ALAS=4; )

Kaikki käyttöliittymämenetelmät ovat julkisia abstrakteja, ja nämä modifioinnit ovat myös valinnaisia.

Julkinen käyttöliittymä Moveable ( void moveRight(); void moveLeft(); void moveUp(); void moveDown(); )

Kuten näemme, käyttöliittymän kuvaaminen on paljon yksinkertaisempaa kuin luokan ilmoittaminen.

Käyttöliittymän toteutus

Jokainen luokka voi toteuttaa mitä tahansa saatavilla olevia rajapintoja. Tässä tapauksessa kaikki abstraktit menetelmät, jotka ilmestyivät liitännöistä tai jotka täytyy toteuttaa, jotta uusi voidaan julistaa ei-abstraktiksi.

Sivu. Toisin kuin monet muut rajapinnat, OOP:n rajapinta on oliokielen tiukasti formalisoitu elementti, ja semanttisena rakenteena sitä käytetään laajasti ohjelmakoodissa.

Liitäntöjen kuvaus ja käyttö

OOP-rajapinnan kuvaus, jos jätämme huomiotta tiettyjen kielten syntaksin yksityiskohdat, koostuu kahdesta osasta:

  • Nimi rajapinta, joka on rakennettu samojen sääntöjen mukaan kuin muut käytetyn ohjelmointikielen tunnisteet. Eri kielillä ja kehitysympäristöissä on erilaiset koodin muotoilukäytännöt, joiden mukaan rajapintojen nimet voidaan muodostaa tiettyjen sääntöjen mukaan, mikä helpottaa käyttöliittymänimen erottamista muiden ohjelmaelementtien nimistä. Esimerkiksi COM-tekniikassa ja kaikissa sitä tukevissa kielissä on käytäntö, jonka mukaan käyttöliittymän nimi rakennetaan käyttämällä mallia "I<Имя>”, eli se koostuu merkityksellisestä nimestä, joka on kirjoitettu isoilla kirjaimilla, jota edeltää iso latinalainen kirjain I (IUnknown, IDispatch, IStringList ja niin edelleen).
  • menetelmät käyttöliittymä. Käyttöliittymäkuvaus määrittelee siihen sisältyvien menetelmien eli luokan proseduurien tai funktioiden nimet ja allekirjoitukset.

Liitäntöjä voidaan käyttää kahdella tavalla:

  • luokka voi toteuttaa käyttöliittymä. Rajapinnan toteutus on se, että luokkakuvauksessa tämä rajapinta on merkitty toteutettavaksi ja luokkakoodissa kaikki rajapinnassa kuvatut menetelmät on välttämättä määritelty täysin tämän rajapinnan kuvauksen allekirjoitusten mukaisesti. Eli jos luokka toteuttaa rajapinnan, kaikki rajapinnassa kuvatut menetelmät ovat olemassa ja niitä voidaan kutsua mille tahansa tämän luokan ilmentymälle. Yksi luokka voi toteuttaa useita rajapintoja samanaikaisesti.
  • Muuttujat ja menetelmäparametrit voidaan ilmoittaa liitäntätyyppisiksi. Tällaiseen muuttujaan tai parametriin voidaan kirjoittaa minkä tahansa luokan ilmentymä, joka toteuttaa rajapinnan. Jos rajapinta on ilmoitettu funktion palautustyypiksi, tämä tarkoittaa, että funktio palauttaa liittymän toteuttavan luokan objektin.

Tyypillisesti olio-ohjelmointikielissä rajapinnat, kuten luokat, voivat periytyä toisiltaan. Tässä tapauksessa lapsirajapinta sisältää kaikki esi-isärajapinnan menetelmät ja mahdollisesti lisää niihin omansa.

Joten toisaalta käyttöliittymä on sopimus, jonka luokka suostuu toteuttamaan. täytäntöönpanosta toisaalta sen käyttöliittymä on tietotyyppi, koska sen kuvaus määrittelee riittävän selkeästi objektien ominaisuudet, jotta muuttujat voidaan kirjoittaa luokan tasolle. On kuitenkin korostettava, että rajapinta ei ole täysi tietotyyppi, koska se määrittelee vain objektien ulkoisen käyttäytymisen. Rajapinnan määrittelemän käyttäytymisen sisäisen rakenteen ja toteutuksen tarjoaa rajapinnan toteuttava luokka; Tästä syystä "rajapinta-ilmentymiä" ei ole puhtaassa muodossaan, ja mikä tahansa "rajapinta"-tyyppinen muuttuja sisältää tiettyjen luokkien esiintymiä.

Rajapintojen käyttö on yksi vaihtoehdoista polymorfismin tarjoamiseksi objektikielissä ja ympäristöissä. Kaikki luokat, jotka toteuttavat saman rajapinnan sen määrittelemän käyttäytymisen suhteen, käyttäytyvät ulkoisesti samalla tavalla. Näin voit kirjoittaa yleisiä tietojenkäsittelyalgoritmeja, jotka käyttävät rajapintoja parametrityypeinä ja soveltavat niitä erityyppisiin objekteihin, jolloin saadaan joka kerta vaadittu tulos.

Esimerkiksi Kloonattava käyttöliittymä voisi kuvata objektien kloonauksen (tarkkojen kopioiden tekemisen) abstraktiota määrittämällä Kloonausmenetelmän, joka kopioi objektin sisällön toiseen samantyyppiseen objektiin. Sitten minkä tahansa luokan, jonka objektit on mahdollisesti kopioitava, tulee toteuttaa Cloneable-rajapinta ja tarjota Clone-menetelmä, ja missä tahansa ohjelmassa, jossa objektien kloonaus vaaditaan, Clone-menetelmää kutsutaan objektiin tätä tarkoitusta varten. Lisäksi tätä menetelmää käyttävällä koodilla on oltava vain käyttöliittymän kuvaus, sillä se ei välttämättä tiedä mitään varsinaisesta luokasta, jonka objektit kopioidaan. Siten rajapinnat mahdollistavat ohjelmistojärjestelmän jakamisen moduuleiksi ilman keskinäisiä koodiriippuvuuksia.

Käyttöliittymät ja abstraktit luokat

Voidaan huomata, että käyttöliittymä on toteutuksen näkökulmasta yksinkertaisesti puhdas abstrakti luokka, eli luokka, jossa ei ole määritelty mitään muuta kuin abstrakteja menetelmiä. Jos ohjelmointikieli tukee useita periytyviä ja abstrakteja menetelmiä (kuten C++), ei ole tarvetta ottaa käyttöön erillistä "rajapinnan" käsitettä kielen syntaksiin. Nämä entiteetit kuvataan käyttämällä abstrakteja luokkia, ja luokat perivät ne abstraktien menetelmien toteuttamiseksi.

Moniperinnön täysi tukeminen on kuitenkin melko monimutkaista ja aiheuttaa monia ongelmia sekä kielen toteutustasolla että sovellusarkkitehtuurin tasolla. Liitäntöjen käsitteen esittely on kompromissi, joka mahdollistaa monet moniperinnön edut (erityisesti mahdollisuuden määritellä kätevästi loogisesti liittyviä sarjoja menetelmät luokkamaisten entiteettien muodossa, jotka mahdollistavat perimisen ja toteutuksen) toteuttamatta sitä täysin ja siten kohtaamatta suurinta osaa sen aiheuttamista vaikeuksista.

Useita perintö- ja käyttöliittymätoteutuksia

Tyypillisesti ohjelmointikielet mahdollistavat käyttöliittymän perimisen useilta esi-isiltä. Kaikista esi-isien liitännöissä ilmoitetuista menetelmistä tulee osa jälkeläisrajapinnan ilmoitusta. Toisin kuin luokkaperintö, usean rajapinnan periytyminen on paljon yksinkertaisempaa toteuttaa eikä aiheuta merkittäviä vaikeuksia.

Yksi törmäys rajapintojen usean periytymisen ja useiden rajapintojen toteuttamisen kanssa yhden luokan toimesta on kuitenkin edelleen mahdollinen. Se tapahtuu, kun kahdella tai useammalla uuden rajapinnan perimällä tai luokan toteuttamalla rajapinnalla on menetelmiä, joilla on samat allekirjoitukset. Ohjelmointikielten kehittäjät joutuvat tällaisissa tapauksissa valitsemaan yksi tai toinen menetelmä ristiriitojen ratkaisemiseksi. Tässä on useita vaihtoehtoja:

  • Kieltää. On yksinkertaisesti kiellettyä toteuttaa useita rajapintoja samassa luokassa, joilla on samat allekirjoitukset. Jos luokka vaatii yhteensopimattomien liitäntöjen yhdistelmän, ohjelmoijan tulee valita jokin toinen tapa ratkaista ongelma, esimerkiksi valita useita luokkia, joista jokainen toteuttaa yhden vaadituista liitännöistä ja käyttää niiden esiintymiä yhdessä.
  • Selkeän epäselvyyden ratkaisu. Jos kääntäjä havaitsee törmäyksen, ohjelmoijan on nimenomaisesti ilmoitettava, mitä rajapintamenetelmää hän toteuttaa ja kutsuu. Eli samannimiset menetelmät toteutetaan erikseen, ja kun niitä kutsutaan, ilmoitetaan, kumpaa niistä kutsutaan. Kutsuttaessa samannimistä menetelmiä kautta tyyppinen muuttuja rajapinnan epäselvyyttä ei synny, jos muuttujatyyppinä käytetyllä rajapinnalla on vain yksi menetelmä etunimi. Tämän ratkaisun muunnelma on eksplisiittinen uudelleennimeäminen samannimisille perityille tai toteutetuille menetelmille, jonka vuoksi toteutusluokassa ei ole samannimistä menetelmiä, mutta rajapinnan kautta käytettäessä vaadittu toteutus kutsutaan aina.
  • Samannimisen menetelmien yleinen toteutus. Jos useita samalla allekirjoituksella varustettuja menetelmiä peritään tai toteutetaan, ne yhdistetään periytyvässä rajapinnassa ja toteutusluokassa ne saavat yhden yhteisen toteutuksen. Tämä toimii hyvin tapauksissa, joissa samannimiset menetelmät eri liitännöissä ovat identtisiä tarkoitetussa toiminnallisuudessa, mutta voivat aiheuttaa ei-toivottuja vaikutuksia, jos näiden menetelmien käyttäytymisen on tarkoitus olla erilainen.

Liitännät tietyillä kielillä ja järjestelmillä

Liitäntöjen toteutus määräytyy pitkälti kielen alkuperäisten ominaisuuksien ja käyttötarkoituksen mukaan, jota varten liitännät on otettu käyttöön. Delphi-järjestelmän C++-, D-, Java- ja Object Pascal -kielten rajapintojen käyttöominaisuudet ovat hyvin suuntaa antavia, koska ne osoittavat kolme olennaisesti erilaista tilannetta:

  • Object Pascal -kielen objektialijärjestelmässä ei ollut rajapintoja. Niiden tuki otettiin käyttöön Delphi 2:ssa COM-komponenttien kirjoittamisen ja käytön mahdollistamiseksi. Näin ollen Delphi-rajapintamekanismi keskittyy ensisijaisesti COM-tekniikan käyttöön.
  • Javassa käyttöliittymät sisältyvät alun perin kieleen ja ovat kiinteä osa sitä.
  • Tarkkaan ottaen C++:ssa ei ole rajapintoja ollenkaan. Tämän kielen erittäin tehokkaan objektialijärjestelmän muilla keinoin toteutetaan samanlainen mekanismi kuin (ja historiallisesti edeltäneet) rajapinnat.

Delfoi

Liitäntöjen ilmoittaminen

Liittymien ilmoittaminen on hyvin samanlaista kuin luokkailmoitusten yksinkertaistaminen.

Se alkaa otsikolla. Ensin määritetään muuntajat. Rajapinta voidaan julistaa julkiseksi, jolloin se on yleiskäyttöinen, tai käyttöoikeusmuuttajaa ei voida määrittää, jolloin rajapinta on vain sen pakettityyppien käytettävissä. Abstraktia rajapintaa ei vaadita, koska kaikki rajapinnat ovat abstrakteja. Voit määrittää sen, mutta sitä ei suositella, jotta koodi ei sotkeudu.

Tätä voi seurata extens-avainsana ja luettelo liitännöistä, joista ilmoitettu käyttöliittymä perii. Vanhempatyyppejä voi olla monia, pääasia, että toistoja ei ole ja että periytymissuhde ei muodosta syklistä riippuvuutta.

Käyttöliittymän periytyminen on todellakin erittäin joustavaa. Joten jos on kaksi rajapintaa, A ja B, ja B perii A:lta, uusi rajapinta C voi periä molemmista. On kuitenkin selvää, että A:n periytymisen osoittaminen on ylimääräistä, kaikki tämän rajapinnan elementit peritään jo rajapinnan B kautta.

julkisen käyttöliittymän ohjeet (

Int RIGHT=1; int VASEN=2; int UP=3; int ALAS=4;

Kaikki käyttöliittymämenetelmät ovat julkisia abstrakteja, ja nämä modifioinnit ovat myös valinnaisia.