Abstracte klasse versus interface
Abstracte klasse (of type) is een type in een systeem met een nominatief type dat door het programma wordt gedeclareerd. Hoewel de naam dit impliceert, kan een abstracte klasse al dan niet abstracte methoden of eigenschappen bevatten. De onderscheidklasse verwijst naar constructies in verschillende talen die kunnen worden gebruikt om abstracte typen te implementeren. Abstracte klassen kunnen worden gekenmerkt door een ontwerpprobleem dat aansluit bij de beste objectgeoriënteerde programmering en hun onvoltooide karakter.
Een interface is een abstract type dat klassen moeten implementeren om een interface op te geven (generiek gesproken). Interfaces mogen alleen handtekeningen van methoden en constante verklaringen bevatten (zowel statische als definitieve), nooit methodendefinities. Interfaces simuleren meerdere overervingen en worden gebruikt om overeenkomsten te coderen die worden gedeeld door verschillende soorten klassen.
Abstracttypen kunnen op verschillende manieren worden gemaakt, aangegeven of gesimuleerd. Een programmeur kan abstracte typen aanduiden door expliciet de trefwoord abstract te gebruiken, door een of meer methoden in de klassedefinitie op te nemen, over te nemen van een ander abstract type zonder de ontbrekende functies te vervangen die nodig zijn om de klassedefinitie te voltooien, of door een bepaalde methode naar het objectgeoriënteerde te verzenden programmeertaal die bekend staat als deze en die de methode niet rechtstreeks implementeert.
Interfaces kunnen worden gedefinieerd met behulp van abstracte methoden. Klassen kunnen ook in interfaces worden geïmplementeerd. Als een klasse een interface implementeert en niet alle methoden implementeert, moet de betekenissamenvatting worden gebruikt, anders is die betekenaar niet nodig (omdat alle interfaces inherent abstract zijn). Klassen kunnen ook meerdere interfaces implementeren.
Hoewel interfaces worden gebruikt om generieke interfaces op te geven, kunnen abstracte typen worden gebruikt om het protocol te definiëren en af te dwingen (dit is een set bewerkingen die alle objecten die het gewenste protocol implementeren moeten ondersteunen). Abstracte typen komen niet voor in talen zonder subtypen. Als zodanig worden subtypen gedwongen om alle benodigde functionaliteit te implementeren, waardoor de juistheid van de uitvoering van het programma wordt gegarandeerd. Er zijn verschillende manieren waarop abstracte typen kunnen worden gemaakt: volledig abstracte basisklassen zijn klassen die expliciet als abstract worden verklaard of abstracte (niet-geïmplementeerde) methoden bevatten; Common Lisp Object Systems bevatten mixins die zijn gebaseerd op het Flavours-systeem; Java, natuurlijk; en Traits, die fungeert als een uitbreiding op Smalltalk.
Samenvatting:
1. Abstracte klassen (of typen) verklaren programma's; interfaces zijn abstracte types die alle klassen moeten implementeren om hun interface te specificeren.
2. Abstract types kunnen expliciet worden aangegeven met behulp van het sleutelwoord; interfaces zijn inherent abstract en hoeven daarom helemaal niet met het trefwoord te worden aangegeven (tenzij een specifieke klasse een interface implementeert maar niet alle methoden implementeert).