et programgrænseflade kan henvise til en lang række forskellige typer interface på forskellige “niveauer”: et operativsystem kan interface med dele af udstyr. Applikationer eller programmer, der kører på operativsystemet, skal muligvis interagere via datastrømme, filtre og rørledninger; og i objektorienterede programmer kan objekter i en applikation muligvis interagere via metoder.
i practiceEdit
et nøgleprincip for design er at forbyde adgang til alle ressourcer som standard, hvilket kun tillader adgang via veldefinerede indgangspunkter, dvs.grænseflader. Programmelgrænseflader giver adgang til computerressourcer (såsom hukommelse, CPU, opbevaring osv. ikke gennem veldesignede grænseflader) til sådanne ressourcer ved hjælp af programmer kan have store konsekvenser—nogle gange katastrofale—for funktionalitet og stabilitet.grænseflader mellem programmelkomponenter kan give konstanter, datatyper, typer af procedurer, undtagelsesspecifikationer og metodesignaturer. Nogle gange defineres offentlige variabler også som en del af en grænseflade.
grænsefladen til et programmodul a defineres bevidst separat fra implementeringen af dette modul. Sidstnævnte indeholder den faktiske kode for de procedurer og metoder, der er beskrevet i grænsefladen, samt andre “private” variabler, procedurer osv. Et andet programmodul B, for eksempel klienten til A, der interagerer med A, er tvunget til at gøre det kun gennem den offentliggjorte grænseflade. En praktisk fordel ved dette arrangement er, at udskiftning af implementeringen af A med en anden implementering af den samme grænseflade ikke bør få B til at mislykkes—Hvordan a internt opfylder kravene til grænsefladen er ikke relevant for B, som kun vedrører specifikationerne for grænsefladen. (Se også liskov substitution princip.)
i objektorienterede sprogRediger
på nogle objektorienterede sprog, især dem uden fuld multipel arv, bruges udtrykket interface til at definere en abstrakt type, der ikke indeholder data, men definerer adfærd som metodesignaturer. En klasse, der har kode og data for alle de metoder, der svarer til denne grænseflade og erklærer det, siges at implementere denne grænseflade. Desuden kan man selv i enkeltarvssprog implementere flere grænseflader og kan derfor være af forskellige typer på samme tid.
en grænseflade er således en typedefinition; hvor som helst et objekt kan udveksles (for eksempel i et funktions-eller metodekald), kan typen af det objekt, der skal udveksles, defineres i form af en af dets implementerede grænseflader eller basisklasser snarere end at specificere den specifikke klasse. Denne tilgang betyder, at enhver klasse, der implementerer denne grænseflade, kan bruges. For eksempel kan en dummy-implementering bruges til at gøre det muligt for udviklingen at komme videre, før den endelige implementering er tilgængelig. I et andet tilfælde kan en falsk eller mock implementering erstattes under test. Sådanne stubimplementeringer erstattes af reel kode senere i udviklingsprocessen.
normalt indeholder en metode defineret i en grænseflade ingen kode og kan således ikke i sig selv kaldes; det skal implementeres med ikke-abstrakt kode, der skal køres, når det påberåbes. En grænseflade kaldet ” Stack
“kan definere to metoder: push()
og pop()
. Det kan implementeres på forskellige måder, for eksempel FastStack
og GenericStack
—den første er hurtig, arbejder med en datastruktur af fast størrelse, og den anden bruger en datastruktur, der kan ændres, men på bekostning af noget lavere hastighed.selvom grænseflader kan indeholde mange metoder, kan de kun indeholde en eller slet ingen. For eksempel definerer Java-sproget grænsefladen Readable
der har singlen read()
metode; forskellige implementeringer bruges til forskellige formål, herunder BufferedReader
FileReader
InputStreamReader
PipedReader
og StringReader
div>. Markørgrænseflader som Serializable
indeholder slet ingen metoder og tjener til at give kørselsinformation til generisk behandling ved hjælp af refleksion.
programmering til interfaceredit
brugen af grænseflader giver mulighed for en programmeringsstil kaldet programmering til grænsefladen. Ideen bag denne tilgang er at basere programmeringslogik på grænsefladerne til de anvendte objekter snarere end på interne implementeringsdetaljer. Programmering til grænsefladen reducerer afhængigheden af implementeringsspecifikationer og gør kode mere genanvendelig.
Ved at skubbe denne ide til det yderste, forlader inversion af kontrol konteksten for at injicere koden med de specifikke implementeringer af grænsefladen, der vil blive brugt til at udføre arbejdet.