Implements beschreibt eine Funktion, die ein Interface implementiert. Erbt also eine Basisklasse ein Interface, so ist die Basisklasse abstrakt. Von der abstrakten Basisklasse können nun mehrere Ableitungen gemacht werden. Alle müssen das Interface implementieren, die Implementierung kann sich aber bei mehreren Ableistungen wiederholen und in eine Implementierung ausgelagert werden.
ArgumentInterface is interface
{
public:
size ArgumentCount();
GetFirst() as Operator ptr;
GetLast() as Operator ptr;
}
ArgumentList implements ArgumentInterface
{
Bildet das ganze auf einer Liste ab
}
ArgumentBinar implements ArgumentInterface
{
Bildet das ganz auf zwei Argumentzeigern ab
}
Operator is ArgumentInterface
{
/* Operator kann die Funktionen aus ArgumentInterface nutzen, bleibt selbst aber abstrakt */
}
BinarOperator is Operator( ArgumentBinar )
{
}
List is Operator( ArgumentList )
{}
Die jeweilige Implementierung wird in die vTable für den jeweiligen Typ eingebaut, benötigte Variablen für die Implementierung werden an das abgeleitete Objekt angehängt. Diese gelten dann als „*this“ für die Implementierung.
Im Vergleich zu einem Template (Operator<ArgumentsBinar>, Operator<ArgumentList>) ändert sich hier der Basistyp (Operator) nicht und die Implementierung muss nicht reimplementiert werden.
Es können beliebig viele Interfaces so zusammengestellt werden. Jedes Interface muss genau einmal implentiert werden (oder geforwarded). Eine Implementierung gilt immer für einen Datentypen.
Der Konstruktor der Implements-Klasse wird vor der Basisklasse ausgeführt, damit die Implementsklassen genutzt werden können, um die Basisklasse zu initialisieren.