"Hej, Amigo! I dag vil jeg gerne fortælle dig grundene til, hvorfor grænseflader eksisterer. Du hører ofte, at en bestemt klasse, objekt eller enhed understøtter en bestemt grænseflade. Hvad vil det sige at understøtte en grænseflade ? "

Grænseflader findes for at understøtte specifik adfærd - 1

I en bredere forstand er enhver grænseflade en mekanisme for, at noget kan interagere med noget andet. For eksempel er en fjernbetjening til fjernsynet en fjernbetjening. En hund forstår og udfører kommandoer, hvilket betyder, at hunden understøtter en stemme (kontrol) grænseflade. For at opsummere det hele kan vi sige, at en grænseflade er en standardiseret måde for to ting at interagere på, hvor begge parter kender standarden. Når en person fortæller en hund at "sidde", er hans eller hendes kommando en del af en "hundestemmekontrolgrænseflade", og hvis hunden adlyder kommandoen, så siger vi, at hunden understøtter grænsefladen.

Så det er i programmering. Metoder er handlinger udført på et objekt, på dets data. Og hvis en klasse implementerer bestemte metoder, så «understøtter den udførelsen» af bestemte kommandoer. Hvad vinder vi ved at kombinere metoder til en grænseflade?

1) Hver grænseflade , ligesom en klasse , har et unikt navn. Begge parter kan være 100 % sikre på, at den anden part understøtter den nøjagtige grænseflade, de kender, og ikke en lignende grænseflade.

2) Hver grænseflade pålægger visse begrænsninger for en klasse, der skal understøtte den. Klassen (dens udvikler) bestemmer, hvad den vil gøre, når de metoder, der er nedarvet fra en grænseflade, kaldes, men resultatet bør være inden for grænserne af rimelige forventninger. Hvis vi beordrer en hund til at "sidde" og så ruller den rundt på plads i 5 minutter og derefter sidder, så understøtter den interfacet. Men hvis den i stedet griber dig i benet, så kan vi næppe sige, at den understøtter interfacet. Udførelse af kommandoen gav ikke det forventede resultat.

Lad os sige, at du og dine venner skriver et computerspil. Og du er blevet tildelt at programmere adfærden for én karakter. En af dine kolleger har allerede skrevet kode til at vise alle tegnene på skærmen. En anden kollega, som er ansvarlig for at gemme spillet på disk, har skrevet kode for at gemme alle spilobjekter til en fil. Hver af dem skrev en masse kode og lavede en grænseflade til at interagere med den kode. For eksempel kan det se sådan ud:

Java kode Beskrivelse
interface Saveable
{
 void saveToMap(Map<String, Object> map);
 void loadFromMap(Map<String, Object> map);
}
— Interface til lagring/indlæsning af et objekt fra et kort.
interface Drawable
{
 void draw(Screen screen);
}
— Interface til at tegne et objekt inde i det beståede skærmobjekt.
class PacMan implements Saveable, Drawable
{
…
}
— Din klasse, som understøtter to grænseflader.

Med andre ord, for at understøtte enhver grænseflade (gruppe af grænseflader), skal din klasse:

1) Arve dem

2) Implementer de metoder, der er deklareret i dem

3) Metoderne skal gøre, hvad de var beregnet til.

Så kan resten af ​​programmets kode, som ikke ved noget om din klasse og dens objekter, fungere med din klasse.

"Hvorfor kan koden ikke vide noget om min klasse?"

"Lad os sige, at du tog koden fra et program, som nogen skrev for et år siden. Eller antag, at dine venner købte/licenserede spilmotoren fra en anden. Du har en arbejdskode til spillet. Tusindvis af objekter, der interagerer med hinanden. Og de kan nemt interagere korrekt med dine objekter , hvis du får den interaktion til at ske gennem grænseflader, som dine klasser har implementeret korrekt."

"Langt ude! Jeg vidste ikke, det var muligt."

"Alle store projekter fungerer sådan her. Folk holdt op med at skrive fra bunden for længe siden."

Folk genopfinder heller ikke matematik og alfabet hver gang. I stedet studerer de alt, hvad der var opfundet før dem.