Što je bit sučelja u programiranju?

U PHP OOP-u sučelje je klasa u kojoj su sve metode apstraktne i javne.

Idemo brzo proći kroz tri pojma korištena u ovoj definiciji. Klasa, apstraktna i otvorena. Klasa je predložak ili uzorak objekta i osnova je objektno orijentiranog programiranja. Apstraktna metoda je posebna metoda koja je deklarirana, ali nema tijelo, samo prazne zagrade. Public je modifikator javnog pristupa i povezan je s pristupom metodama. To znači da je dostupan s bilo kojeg mjesta: iz ove klase, izvan nje i iz bilo koje izvedene klase.

PHP sučelje je alat za stvaranje robusnog koda koji definira metode koje treba implementirati klasa bez definiranja rukovanja tim metodama. Ovo je moćan i jednostavan koncept koji se koristi u objektno orijentiranom PHP-u. Za njegovu izradu koristi se ključna riječ sučelje , definirano je na isti način kao PHP klasa. Metode koje sadrži nemaju nikakvu funkcionalnost, ali sučelje navodi koje su metode potrebne drugim klasama. Svaka klasa koja nasljeđuje sučelje mora sadržavati iste metode kao i one sadržane u sučelju, inače će biti izbačena pogreška.

U PHP OOP sučelju specificiramo samo nazive metoda i njihove parametre, a oni se mogu naknadno implementirati. Uobičajeno je da se sve metode sučelja deklariraju kao javne. Za implementaciju sučelja koristite ključnu riječ implements. Ako je potrebno, klasa može implementirati više od jednog sučelja; oni su odvojeni zarezom. Poput klase, sučelje može sadržavati konstante. Jedina razlika je u tome što se ne mogu nadjačati u izvedenoj klasi.

Definiranje i korištenje sučelja

Sučelje se definira pomoću ključne riječi interfejs. Sve metode u njemu moraju biti javne i apstraktne:

životinja sučelja ( )

Ovo je prazno sučelje. Dodat ćemo mu metodu apstraktnog gibanja. Pa ćemo stvarati jednostavan PHP 5 OOP sučelje koje se može implementirati kasnije:

sučelje životinja (javna funkcija motion()())

Ovo sučelje može implementirati bilo koja klasa životinja, sve će klase životinja sadržavati metodu kretanja. Pogledajmo primjer. Za implementaciju sučelja koristimo ključnu riječ implements:

PHP sučelje i apstraktne klase

Sučelja i apstraktne klase vrlo su slične po konceptu. Oni pomažu u stvaranju predložaka za razrede koji će se koristiti u aplikaciji. Prema PHP OOP osnovama, oni se međusobno razlikuju kako slijedi:

  1. U sučelju su sve metode apstraktne (bez implementacije). U apstraktnoj klasi samo su neke metode apstraktne. Apstraktna klasa mora sadržavati barem, jedna apstraktna metoda. Inače će to biti standardna PHP klasa;
  2. U PHP sučelju sve deklarirane metode su javne, dok u apstraktnoj klasi metode mogu biti javne, privatne ili zaštićene. Stoga sučelja imaju ograničenje upotrebe modifikatora pristupa, ali apstraktna klasa nema takva ograničenja;
  3. Klasa može implementirati neograničen broj sučelja. U isto vrijeme, PHP klasa može generirati samo jednu apstraktnu klasu;
  4. Morate nadjačati sve metode sučelja, ali u apstraktnoj klasi imate izbor: nadjačati metode ili ih ostaviti nepromijenjene;
  5. Sučelja imaju stroža pravila od apstraktnih klasa. PHP sučelje dizajnirano je da pruži određenu logiku, djeluje kao prazan omot ili predložak za druge klase.

Za što se koriste PHP sučelja?

Sučelje pomaže programeru razmišljati u pravom smjeru. Iz PHP OOP perspektive, klasa je predložak, a objekt je skup mogućnosti. Više smo zabrinuti za funkcionalnost, što radi, a ne kako to radi. Dakle, definiramo osnovno sučelje koje je uobičajeno i zatim ga implementiramo, što pomaže razmišljanju u pravom smjeru.

Prilagodbe koda u budućnosti

Razvoj u objektno orijentiranom PHP-u omogućuje vam prilagođavanje koda u budućnosti bez utjecaja na glavnu funkcionalnost. Prilikom pisanja koda u budućnosti, te će karakteristike uvijek biti uzete u obzir i zatim uključene dodatne funkcije, ali to neće utjecati na osnovne karakteristike postojećih objekata.

Bolja struktura programa

Za poboljšanje strukture implementiran je objektno orijentirani PHP stvorene aplikacije. Dodavanje sučelja PHP-u pomaže da kodiranje bude uredno i čisto. Sučelja vas sprječavaju u pisanju koda koji je teško održavati i mijenjati. Uz pomoć sučelja možemo jednostavno održavati i modificirati kod, što programere čini učinkovitijima.

Dodavanje svih važnih značajki

Pomoću PHP sučelja možemo kreirati osnovne funkcionalnosti koje se mogu definirati za razne predmete na različite načine, a zatim dodajte druge značajke prema potrebi.

Još jedan OOP PHP primjer implementacije sučelja

klasa Cake implementira Recipe ( metodologija javne funkcije() ( ) )

U ovom kodu vidimo klasu Cake, koja implementira sučelje Recipe.

Prijevod članka “PHP sučelje” pripremio je prijateljski projektni tim.

Opis OOP sučelja, ako zanemarimo detalje sintakse pojedinih jezika, sastoji se od dva dijela:

  • Ime sučelje, koje je izgrađeno prema istim pravilima kao i drugi identifikatori korištenog programskog jezika. Različiti jezici i razvojna okruženja imaju različite konvencije oblikovanja koda, prema kojima se nazivi sučelja mogu oblikovati prema određenim pravilima koja olakšavaju razlikovanje naziva sučelja od naziva ostalih programskih elemenata. Na primjer, u COM tehnologije i svi jezici koji ga podržavaju, postoji konvencija prema kojoj se naziv sučelja gradi prema obrascu “ja<Имя>“, odnosno sastoji se od napisanog sa veliko slovo smisleno ime ispred kojeg stoji veliko slovo latinično slovo I (IUnknown, IDispatch, IStringList i tako dalje).
  • Metode sučelje. Opis sučelja definira nazive i potpise metoda koje su u njega uključene, odnosno procedura ili funkcija klase.

Sučelja se mogu koristiti na dva načina:

  • razred može implementirati sučelje. Implementacija sučelja je ona u opisu klase ovo sučelje naznačeno je kao implementabilno, au kodu klase sve metode koje su opisane u sučelju nužno su definirane u potpunom skladu s potpisima iz opisa ovog sučelja. To jest, ako klasa implementira sučelje, sve metode opisane u sučelju postoje i mogu se pozvati za bilo koju instancu ove klase. Jedna klasa može implementirati nekoliko sučelja u isto vrijeme.
  • Moguće je deklarirati varijable i parametre metode kao tip sučelja. Instanca bilo koje klase koja implementira sučelje može se napisati u takvu varijablu ili parametar. Ako je sučelje deklarirano kao tip povrata funkcije, to znači da funkcija vraća objekt klase koja implementira sučelje.

Tipično, u objektno orijentiranim programskim jezicima, sučelja, poput klasa, mogu se naslijeđivati ​​jedno od drugog. U ovom slučaju sučelje dijete uključuje sve metode sučelja pretka i eventualno im dodaje vlastite.

Dakle, s jedne strane, sučelje je ugovor koji klasa pristaje izvršiti. provedbu njegovo je, s druge strane, sučelje podatkovni tip, jer njegov opis dovoljno jasno definira svojstva objekata kako bi se upisivale varijable u rangu s klasom. Međutim, treba naglasiti da sučelje nije potpuni tip podataka, budući da specificira samo vanjsko ponašanje objekata. Unutarnja struktura a implementacija ponašanja specificiranog sučeljem osigurava klasa koja implementira sučelje; zato su "instance sučelja" u čisti oblik ne postoji, a svaka varijabla tipa "sučelje" sadrži instance konkretnih klasa.

Korištenje sučelja je jedna od opcija za pružanje polimorfizma u objektnim jezicima i okruženjima. Sve klase koje implementiraju isto sučelje, u smislu ponašanja koje definira, ponašaju se prema van jednako. To vam omogućuje pisanje generaliziranih algoritama za obradu podataka koji koriste sučelja kao tipove parametara i njihovu primjenu na objekte različite vrste, dobivajući traženi rezultat svaki put.

Na primjer, sučelje "Cloneable" moglo bi opisati apstrakciju kloniranja (stvaranje točne kopije) objekte određivanjem metode "Klon" koja bi trebala kopirati sadržaj objekta u drugi objekt iste vrste. Tada svaka klasa čiji objekti možda trebaju biti kopirani mora implementirati Cloneable sučelje i osigurati Clone metodu, a bilo gdje u programu gdje je potrebno kloniranje objekata, Clone metoda se poziva na objektu u tu svrhu. Štoviše, kod koji koristi ovu metodu mora imati samo opis sučelja; možda neće znati ništa o stvarnoj klasi čiji se objekti kopiraju. Dakle, sučelja vam omogućuju da se podijelite programski sustav u module bez međusobne ovisnosti koda.

Sučelja i apstraktne klase

Možda ćete primijetiti da je sučelje, zapravo, samo čista apstraktna klasa, odnosno klasa u kojoj ništa nije definirano osim apstraktnih metoda. Ako programski jezik podržava višestruko nasljeđivanje i apstraktne metode (kao što je C++), tada nema potrebe za uvođenjem zasebnog koncepta "sučelja". Slični entiteti opisuju se kao apstraktne klase i nasljeđuju ih klase za implementaciju apstraktnih metoda.

Međutim, potpuna podrška višestrukog nasljeđivanja prilično je složena i uzrokuje mnoge probleme, kako na razini implementacije jezika tako i na razini arhitekture aplikacije. Uvođenje koncepta sučelja je kompromis koji vam omogućuje da dobijete mnoge prednosti višestrukog nasljeđivanja bez njegove pune implementacije i stoga bez susreta s većinom poteškoća koje ono uzrokuje.

Višestruko nasljeđivanje i implementacija sučelja

Tipično, programski jezici dopuštaju da sučelje bude naslijeđeno od više sučelja predaka. Sve metode deklarirane u sučeljima pretka postaju dio deklaracije sučelja potomka. Za razliku od nasljeđivanja klasa, višestruko nasljeđivanje sučelja mnogo je jednostavnije za implementaciju i ne uzrokuje značajne poteškoće.

Međutim, jedan sraz sa višestruko nasljeđivanje sučelja i kada je još uvijek moguća implementacija nekoliko sučelja s jednom klasom. To se događa kada dva ili više sučelja naslijeđena od novog sučelja ili implementirana od strane klase imaju metode s istim potpisima. Programeri programskih jezika prisiljeni su odabrati jednu ili drugu metodu za rješavanje proturječja u takvim slučajevima. Ovdje postoji nekoliko opcija:

  • Zabrana. Jednostavno je zabranjeno implementirati nekoliko sučelja u jednoj klasi koja imaju metode s istim potpisima. Ako klasa zahtijeva kombinaciju nekompatibilnih sučelja, programer mora odabrati drugi način rješavanja problema, na primjer, odabrati nekoliko klasa, od kojih svaka implementira jedan od potrebna sučelja, te zajedno koristiti njihove instance.
  • Eksplicitno rješavanje dvosmislenosti. Ako prevodilac otkrije koliziju, programer mora eksplicitno naznačiti koju metodu sučelja implementira i poziva. Odnosno, metode istog imena implementiraju se odvojeno, a kada se pozovu, naznačeno je koja se od njih poziva. Varijanta ovog rješenja je eksplicitno preimenovanje za naslijeđene ili implementirane metode koje imaju isti naziv, zbog čega unutar implementirajuće klase nema istoimenih metoda, ali kada im se pristupi preko sučelja uvijek se poziva tražena implementacija.
  • Opća implementacija istoimenih metoda. Ako je nekoliko metoda s istim potpisom naslijeđeno ili implementirano, tada se one kombiniraju u sučelju nasljeđivanja, au klasi implementacije dobivaju jednu opća provedba. Ovo je dobro za slučajeve gdje su metode istog imena različita sučelja identične u predviđenoj funkciji, ali mogu uzrokovati neželjeni efekti ako bi ponašanje ovih metoda trebalo biti drugačije.

Sučelja na određenim jezicima i sustavima

Implementacija sučelja je uvelike određena početne sposobnosti jezik i svrhu za koju se sučelja uvode u njega. Značajke korištenja sučelja u jezicima C++, Java i Object Pascal sustava Delphi vrlo su indikativne, jer pokazuju tri bitno različite situacije:

  • U objektnom podsustavu jezika Object Pascal nije bilo sučelja; njihova je podrška uvedena u Delphi 2 kako bi se omogućilo pisanje i korištenje COM komponenti. Sukladno tome, mehanizam Delphi sučelja usmjeren prvenstveno na korištenje COM tehnologije.
  • U Javi su sučelja inicijalno uključena u jezik, kao njegov sastavni dio.
  • U C++-u, strogo govoreći, uopće nema sučelja. Mehanizam sličan (i povijesno prethodnim) sučeljima implementiran je drugim sredstvima iznimno snažnog objektnog podsustava ovog jezika.

Delphi

U COM-u, Delphi tehnologije nalikuju klasama. Kako su sve klase potomci klase

Primjer deklaracije sučelja:

IMyInterface = procedura sučelja DoSomething; kraj ;

Da biste deklarirali implementaciju sučelja, u opisu klase morate naznačiti njihova imena u zagradama iza ključne riječi class, nakon naziva klase pretka. Budući da je sučelje ugovor koji se treba izvršiti, program se ne kompajlira sve dok se procedura DoSomething ne implementira u implementirajuću klasu;

Gore spomenuti fokus Delphi sučelja na COM tehnologiju doveo je do nekih neugodnosti. Činjenica je da sučelje IUnknown (od kojeg nasljeđuju sva druga sučelja) već sadrži tri metode: QueryInterface,_AddRef, _Release, stoga svaka klasa koja implementira bilo koje sučelje mora implementirati te metode, čak i ako sučelje i klasa nemaju ništa za učiniti s COM.

Primjer klase koja implementira sučelje

TMyClass = class(TMyParentClass, IMyInterface) procedure DoSomething; funkcija QueryInterface(const IID: TGUID; out Obj) : HResult; stdcall; funkcija _AddRef: Integer ; stdcall; funkcija _Release: Integer ; stdcall; kraj ;

C++

Java

Deklariranje sučelja

Deklariranje sučelja vrlo je slično pojednostavljivanju deklaracija klasa.

Počinje s naslovom. Prvo se navode modifikatori. Sučelje se može deklarirati kao javno i tada će mu biti dostupno opće uporabe, ili modifikator pristupa možda nije naveden, u kojem slučaju je sučelje dostupno samo njegovim vrstama paketa. Apstraktni modifikator za sučelje nije potreban jer su sva sučelja apstraktna. Možete ga odrediti, ali se ne preporučuje da to učinite kako ne biste zatrpali kod.

Ovo može biti praćeno ključnom riječi extends i popisom sučelja od kojih će deklarirano sučelje naslijediti. Može biti mnogo vrsta roditelja, glavno je da nema ponavljanja i da odnos nasljeđivanja ne tvori cikličku ovisnost.

Nasljeđivanje sučelja je doista vrlo fleksibilno. Dakle, ako postoje dva sučelja, A i B, pri čemu B nasljeđuje A, tada novo sučelje C može naslijediti od obojice. Međutim, jasno je da je određivanje nasljeđivanja od A suvišno; svi elementi ovog sučelja već će biti naslijeđeni kroz sučelje B.

Upute za javno sučelje ( int DESNO=1; int LIJEVO=2; int GORE=3; int DOLJE=4; )

Sve metode sučelja su javni apstraktni i ovi modifikatori su također izborni.

Javno sučelje Moveable ( void moveRight(); void moveLeft(); void moveUp(); void moveDown(); )

Kao što vidimo, opisivanje sučelja puno je jednostavnije od deklariranja klase.

Implementacija sučelja

Da bi se implementiralo sučelje, ono mora biti navedeno prilikom deklaracije klase pomoću ključne riječi implements. Primjer:

Sučelje I ( void interfaceMethod() ; ) javna klasa ImplementingInterface implementira I ( void interfaceMethod() ( System .out .println ( "Ova metoda je implementirana iz sučelja I") ; ) public static void main(String args) ( ImplementingInterface temp = new ImplementingInterface() ; temp.interfaceMethod () ; ) )

Svaka klasa može implementirati bilo koji dostupna sučelja. U ovom slučaju klasa mora implementirati sve apstraktne metode koje su se pojavile prilikom nasljeđivanja od sučelja ili nadređene klase tako da se nova klasa može proglasiti neapstraktnom.

Ako od različiti izvori metode s istim potpisom se nasljeđuju, tada je dovoljno samo jednom opisati implementaciju i ona će se koristiti za sve te metode. Međutim, ako imaju različitu povratnu vrijednost, dolazi do sukoba. Primjer:

Sučelje A ( int getValue() ; ) sučelje B ( double getValue() ; ) sučelje C ( int getValue() ;) javna klasa Correct implementira A, C // klasa ispravno nasljeđuje metode s istim potpisom( int getValue() ( return 5 ; ) ) class Wrong implementira A, B // klasa uzrokuje pogrešku kompilacije( int getValue() ( return 5 ; ) double getValue() ( return 5.5 ; ) )

) je semantička i sintaktička konstrukcija u programskom kodu koja se koristi za usluge koje pruža ili.

Sučelja u Delphiju

Sučelja u C++

Ulogu sučelja u C++-u obavljaju apstraktne klase.

Sučelja u Javi

Deklariranje sučelja

Deklariranje sučelja vrlo je slično pojednostavljivanju deklaracija klasa.

Počinje s naslovom. Prvo se navode modifikatori. Sučelje se može proglasiti javnim, u kojem slučaju će biti dostupno za javnu upotrebu, ili se modifikator pristupa ne može navesti, u kojem slučaju je sučelje dostupno samo za svoj paket. apstraktni modifikator sučelje nije potrebno jer su sva sučelja . Možete ga odrediti, ali se ne preporučuje da to učinite kako ne biste zatrpali .

Ovo može biti praćeno ključnom riječi extends i sučeljima iz kojih će biti deklarirano sučelje. Roditeljskih vrsta može biti mnogo, glavno je da nema ponavljanja i da nasljedni odnos ne stvara ovisnost.

Nasljeđivanje sučelja je doista vrlo fleksibilno. Dakle, ako postoje dva sučelja, A i B, a B nasljeđuje od A, tada novo sučelje C može naslijediti od oba. Međutim, jasno je da je određivanje nasljeđivanja od A suvišno; svi elementi ovog sučelja već će biti naslijeđeni kroz sučelje B.

Zatim unutra vitičaste zagrade sučelje se snima.

Javno sučelje Drawble proširuje Colorable, Resizable ( )

Tijelo sučelja sastoji se od deklaracije, odnosno apstraktnih metoda. Sva polja sučelja moraju biti javna konačna statičnost, tako da navođenje ovih modifikatora nije potrebno, pa čak i nepoželjno, kako ne bi zatrpali . Budući da su polja deklarirana, moraju se odmah inicijalizirati.

Upute za javno sučelje ( int DESNO=1; int LIJEVO=2; int GORE=3; int DOLJE=4; )

Sve metode sučelja su javni apstraktni i ovi modifikatori su također izborni.

Javno sučelje Moveable ( void moveRight(); void moveLeft(); void moveUp(); void moveDown(); )

Kao što vidimo, opisivanje sučelja puno je jednostavnije od deklariranja klase.

Implementacija sučelja

Svaka klasa može implementirati bilo koje dostupno sučelje. U ovom slučaju, sve apstraktne metode koje su se pojavile iz sučelja ili moraju biti implementirane tako da se nova može proglasiti neapstraktnom.

Strana. Za razliku od mnogih drugih vrsta sučelja, sučelje u OOP-u je strogo formalizirani element objektno orijentiranog jezika i, kao semantička konstrukcija, široko se koristi u programskom kodu.

Opis i uporaba sučelja

Opis OOP sučelja, ako zanemarimo detalje sintakse pojedinih jezika, sastoji se od dva dijela:

  • Ime sučelje, koje je izgrađeno prema istim pravilima kao i drugi identifikatori korištenog programskog jezika. Različiti jezici i razvojna okruženja imaju različite konvencije oblikovanja koda, prema kojima se nazivi sučelja mogu formirati prema određenim pravilima koja olakšavaju razlikovanje naziva sučelja od naziva drugih elemenata programa. Na primjer, u COM tehnologiji i svim jezicima koji je podržavaju, postoji konvencija prema kojoj se naziv sučelja gradi pomoću obrasca “I<Имя>”, odnosno sastoji se od smislenog imena napisanog velikim slovima, ispred kojeg stoji veliko latinično slovo I (IUnknown, IDispatch, IStringList i tako dalje).
  • Metode sučelje. Opis sučelja definira nazive i potpise metoda koje su u njega uključene, odnosno procedura ili funkcija klase.

Sučelja se mogu koristiti na dva načina:

  • razred može implementirati sučelje. Implementacija sučelja je da je u opisu klase to sučelje naznačeno kao implementabilno, au kodu klase sve metode koje su opisane u sučelju nužno su definirane u potpunom skladu sa potpisima iz opisa ovog sučelja. To jest, ako klasa implementira sučelje, sve metode opisane u sučelju postoje i mogu se pozvati za bilo koju instancu ove klase. Jedna klasa može implementirati nekoliko sučelja u isto vrijeme.
  • Moguće je deklarirati varijable i parametre metode kao tip sučelja. Instanca bilo koje klase koja implementira sučelje može se napisati u takvu varijablu ili parametar. Ako je sučelje deklarirano kao tip povrata funkcije, to znači da funkcija vraća objekt klase koja implementira sučelje.

Tipično, u objektno orijentiranim programskim jezicima, sučelja, poput klasa, mogu se naslijeđivati ​​jedno od drugog. U ovom slučaju sučelje dijete uključuje sve metode sučelja pretka i eventualno im dodaje vlastite.

Dakle, s jedne strane, sučelje je ugovor koji klasa pristaje izvršiti. provedbu njegovo je, s druge strane, sučelje podatkovni tip, jer njegov opis dovoljno jasno definira svojstva objekata kako bi se upisivale varijable u rangu s klasom. Međutim, treba naglasiti da sučelje nije potpuni tip podataka, budući da specificira samo vanjsko ponašanje objekata. Internu strukturu i implementaciju ponašanja navedenog sučeljem osigurava klasa koja implementira sučelje; zato ne postoje "instance sučelja" u njihovom čistom obliku, a svaka varijabla tipa "sučelje" sadrži instance specifičnih klasa.

Korištenje sučelja je jedna od opcija za pružanje polimorfizma u objektnim jezicima i okruženjima. Sve klase koje implementiraju isto sučelje, u smislu ponašanja koje definira, ponašaju se prema van jednako. To vam omogućuje pisanje generaliziranih algoritama za obradu podataka koji koriste sučelja kao tipove parametara i primjenjuju ih na objekte različitih tipova, svaki put dobivajući traženi rezultat.

Na primjer, sučelje Cloneable moglo bi opisati apstrakciju kloniranja (izrada točnih kopija) objekata određivanjem metode Clone koja bi kopirala sadržaj objekta u drugi objekt iste vrste. Tada svaka klasa čiji objekti možda trebaju biti kopirani mora implementirati Cloneable sučelje i osigurati Clone metodu, a bilo gdje u programu gdje je potrebno kloniranje objekata, Clone metoda se poziva na objektu u tu svrhu. Štoviše, kod koji koristi ovu metodu mora imati samo opis sučelja; možda neće znati ništa o stvarnoj klasi čiji se objekti kopiraju. Dakle, sučelja omogućuju da se softverski sustav podijeli u module bez međusobne ovisnosti koda.

Sučelja i apstraktne klase

Može se primijetiti da je sučelje, sa stajališta implementacije, jednostavno čista apstraktna klasa, to jest klasa u kojoj ništa nije definirano osim apstraktnih metoda. Ako programski jezik podržava višestruko nasljeđivanje i apstraktne metode (kao što je C++), tada nema potrebe uvoditi poseban koncept "sučelja" u sintaksu jezika. Ti su entiteti opisani pomoću apstraktnih klasa i klase ih nasljeđuju za implementaciju apstraktnih metoda.

Međutim, potpuna podrška višestrukog nasljeđivanja prilično je složena i uzrokuje mnoge probleme, kako na razini implementacije jezika tako i na razini arhitekture aplikacije. Uvođenje koncepta sučelja je kompromis koji dopušta mnoge prednosti višestrukog nasljeđivanja (osobito mogućnost prikladnog logičkog definiranja povezani skupovi metode u obliku entiteta sličnih klasi koji dopuštaju nasljeđivanje i implementaciju) bez njegove pune implementacije i stoga bez susreta s većinom poteškoća koje uzrokuje.

Višestruko nasljeđivanje i implementacija sučelja

Tipično, programski jezici dopuštaju da sučelje bude naslijeđeno od više sučelja predaka. Sve metode deklarirane u sučeljima pretka postaju dio deklaracije sučelja potomka. Za razliku od nasljeđivanja klasa, višestruko nasljeđivanje sučelja mnogo je jednostavnije za implementaciju i ne uzrokuje značajne poteškoće.

Međutim, još uvijek je moguća jedna kolizija s višestrukim nasljeđivanjem sučelja i implementacijom nekoliko sučelja od strane jedne klase. To se događa kada dva ili više sučelja naslijeđena od novog sučelja ili implementirana od strane klase imaju metode s istim potpisima. Programeri programskih jezika prisiljeni su odabrati jednu ili drugu metodu za rješavanje proturječja u takvim slučajevima. Ovdje postoji nekoliko opcija:

  • Zabrana. Jednostavno je zabranjeno implementirati nekoliko sučelja u jednoj klasi koja imaju metode s istim potpisima. Ako klasa zahtijeva kombinaciju nekompatibilnih sučelja, programer mora odabrati drugi način rješavanja problema, na primjer, odabrati nekoliko klasa, od kojih svaka implementira jedno od potrebnih sučelja, i koristiti njihove instance zajedno.
  • Eksplicitno rješavanje dvosmislenosti. Ako prevodilac otkrije koliziju, programer mora eksplicitno naznačiti koju metodu sučelja implementira i poziva. Odnosno, metode istog imena implementiraju se odvojeno, a kada se pozovu, naznačeno je koja se od njih poziva. Prilikom pozivanja istoimene metode putem varijabla tipa dvosmislenost sučelja ne nastaje ako sučelje koje se koristi kao tip varijable ima samo jednu metodu sa dati ime. Varijanta ovog rješenja je eksplicitno preimenovanje za naslijeđene ili implementirane metode koje imaju isti naziv, zbog čega unutar implementirajuće klase nema istoimenih metoda, ali kada im se pristupi preko sučelja uvijek se poziva tražena implementacija.
  • Opća implementacija istoimenih metoda. Ako je nekoliko metoda s istim potpisom naslijeđeno ili implementirano, tada se one kombiniraju u sučelju nasljeđivanja, au klasi implementacije dobivaju jednu zajedničku implementaciju. Ovo dobro funkcionira u slučajevima kada su metode istog imena na različitim sučeljima identične u planiranoj funkcionalnosti, ali mogu izazvati neželjene učinke ako se ponašanje tih metoda razlikuje.

Sučelja na određenim jezicima i sustavima

Implementacija sučelja uvelike je određena izvornim mogućnostima jezika i svrhom za koju su sučelja uvedena u njega. Značajke korištenja sučelja u jezicima C++, D, Java i Object Pascal sustava Delphi vrlo su indikativne, jer pokazuju tri bitno različite situacije:

  • U objektnom podsustavu jezika Object Pascal nije bilo sučelja; njihova je podrška uvedena u Delphi 2 kako bi se omogućilo pisanje i korištenje COM komponenti. Sukladno tome, mehanizam Delphi sučelja usmjeren je prvenstveno na korištenje COM tehnologije.
  • U Javi su sučelja inicijalno uključena u jezik, kao njegov sastavni dio.
  • U C++-u, strogo govoreći, uopće nema sučelja. Mehanizam sličan (i povijesno prethodnim) sučeljima implementiran je drugim sredstvima iznimno snažnog objektnog podsustava ovog jezika.

Delphi

Deklariranje sučelja

Deklariranje sučelja vrlo je slično pojednostavljivanju deklaracija klasa.

Počinje s naslovom. Prvo se navode modifikatori. Sučelje se može proglasiti javnim, u kojem slučaju će biti dostupno za opću upotrebu, ili se modifikator pristupa ne mora navesti, u kojem slučaju je sučelje dostupno samo svojim vrstama paketa. Apstraktni modifikator za sučelje nije potreban jer su sva sučelja apstraktna. Možete ga odrediti, ali se ne preporučuje da to učinite kako ne biste zatrpali kod.

Ovo može biti praćeno ključnom riječi extends i popisom sučelja od kojih će deklarirano sučelje naslijediti. Može biti mnogo vrsta roditelja, glavno je da nema ponavljanja i da odnos nasljeđivanja ne tvori cikličku ovisnost.

Nasljeđivanje sučelja je doista vrlo fleksibilno. Dakle, ako postoje dva sučelja, A i B, a B nasljeđuje od A, tada novo sučelje C može naslijediti od oba. Međutim, jasno je da je određivanje nasljeđivanja od A suvišno; svi elementi ovog sučelja već će biti naslijeđeni kroz sučelje B.

javno sučelje upute (

Int DESNO=1; int LIJEVO=2; int GORE=3; int DOLJE=4;

Sve metode sučelja su javni apstraktni i ovi modifikatori su također izborni.