een softwareinterface kan verwijzen naar een breed scala van verschillende soorten interface op verschillende “niveaus”: een besturingssysteem kan met hardware-onderdelen communiceren. Toepassingen of programma ’s die op het besturingssysteem draaien moeten mogelijk communiceren via datastromen, filters en pijpleidingen; en in objectgeoriënteerde programma’ s moeten objecten in een toepassing mogelijk communiceren via methoden.
in de praktijkdit
een belangrijk principe van het ontwerp is om standaard toegang tot alle bronnen te verbieden, waarbij toegang alleen wordt toegestaan via duidelijk gedefinieerde toegangspunten, d.w.z. interfaces. Software-interfaces bieden toegang tot computerbronnen (zoals geheugen, CPU, opslag, enz.) van het onderliggende computersysteem; directe toegang (d.w.z. niet via goed ontworpen interfaces) tot dergelijke bronnen door software kan grote—soms rampzalige—vertakkingen hebben voor functionaliteit en stabiliteit.
Interfaces tussen softwarecomponenten kunnen constanten, gegevenstypen, soorten procedures, uitzonderingsspecificaties en methodehandtekeningen leveren. Soms worden publieke variabelen ook gedefinieerd als onderdeel van een interface.
De interface van een softwaremodule A wordt bewust gescheiden van de implementatie van die module gedefinieerd. Deze laatste bevat de eigenlijke code van de procedures en methoden die in de interface worden beschreven, evenals andere “private” variabelen, procedures, enz. Een andere softwaremodule B, bijvoorbeeld de client naar A, die interageert met A, wordt gedwongen dit alleen te doen via de gepubliceerde interface. Een praktisch voordeel van deze regeling is dat het vervangen van de implementatie van A door een andere implementatie van dezelfde interface niet tot een mislukking mag leiden—Hoe a intern aan de eisen van de interface voldoet, is niet relevant voor B, dat alleen betrekking heeft op de specificaties van de interface. (Zie ook Liskov substitutieprincipe.)
in objectgeoriënteerde talendit
in sommige Object-oriented languages, vooral die zonder volledige meervoudige overerving, wordt de term interface gebruikt om een abstract type te definiëren dat geen gegevens bevat, maar gedrag definieert als method signatures. Een klasse met code en gegevens voor alle methoden die overeenkomen met die interface en dat verklaart, wordt gezegd om die interface te implementeren. Bovendien, zelfs in single-overerving-talen, kan men meerdere interfaces implementeren, en kan dus van verschillende types tegelijkertijd zijn.
een interface is dus een typedefinitie; overal waar een object kan worden uitgewisseld (bijvoorbeeld in een functie-of methodeaanroep) kan het type van het object worden gedefinieerd in termen van een van de geà mplementeerde interfaces of baseklassen in plaats van de specifieke klasse te specificeren. Deze aanpak betekent dat elke klasse die die interface implementeert kan worden gebruikt. Zo kan bijvoorbeeld een dummy-implementatie worden gebruikt om de ontwikkeling vooruit te laten gaan voordat de definitieve implementatie beschikbaar is. In een ander geval kan een nep-of mock-implementatie worden vervangen tijdens het testen. Dergelijke stub-implementaties worden later in het ontwikkelingsproces vervangen door echte code.
gewoonlijk bevat een methode gedefinieerd in een interface geen code en kan dus niet zelf worden aangeroepen; het moet worden geïmplementeerd met niet-abstracte code om te worden uitgevoerd wanneer het wordt aangeroepen. Een interface genaamd “Stack
“kan twee methoden definiëren: push()
en pop()
. Het kan op verschillende manieren worden geïmplementeerd, bijvoorbeeld FastStack
en GenericStack
—de eerste is snel, werkt met een gegevensstructuur van vaste grootte, en de tweede met behulp van een gegevensstructuur die kan worden aangepast, maar tegen een iets lagere snelheid.
hoewel interfaces veel methoden kunnen bevatten, kunnen ze slechts één of zelfs helemaal geen bevatten. Bijvoorbeeld, de Java taal definieert de interface Readable
die de enkele read()
methode heeft; verschillende implementaties worden gebruikt voor verschillende doeleinden, waaronder BufferedReader
FileReader
InputStreamReader
PipedReader
, en StringReader
. Markerinterfaces zoals Serializable
bevatten helemaal geen methoden en dienen om runtime-informatie te verstrekken aan generieke verwerking met behulp van reflectie.
programmeren naar de interfaceEdit
het gebruik van interfaces staat een programmeerstijl toe die programmeren naar de interface wordt genoemd. Het idee achter deze aanpak is om programmeerlogica te baseren op de interfaces van de gebruikte objecten, in plaats van op interne implementatiedetails. Programmeren naar de interface vermindert de afhankelijkheid van implementatiespecificaties en maakt code meer herbruikbaar.
Dit idee tot het uiterste doordrukken, inversie van controle laat de context om de code te injecteren met de specifieke implementaties van de interface die zal worden gebruikt om het werk uit te voeren.