====== interface ======
Ein interface kann generisch sein, muss aber nicht.
operator $ is interface
{
operator $ as string; // allgemein
};
calc is interface
{
operator + ( lhs, rhs is this\ ) as this\; // generisch
operator + ( lhs, rhs is this\ ) as this\;
};
int = 0 with { operator $; calc };
Eine Schnittstelle kann UnitTests bemängeln. Die Schnittstellen können im interface dokumentiert werden und verlangt werden, dass die Implementierung einen UnitTest anfertigt, der die korrekte implementierung der Dokumentation entsprechend nachweist.
Im Idealfall kann im Interface ein Unittest allgemeine Fälle abprüfen. So darf eine Spezialisierung bon operator $ nicht etwa etwas anderes als einen String zurückliefern. Das kann im Interface festgehalten werden und getestet werden.
Hier könnte man auch mal die Einschränkungen bei IFC zu rate ziehen. Dokumentiert man beispielsweise, dass eine Methode zum Beispiel nur 2 oder 3 zurückliefern kann, so kann man das ja im Interface dokumentieren und in einer Debugversion auch zur Laufzeit prüfen lassen.
====== Shadowing ======
Eine als Interface deklarierte Funktion sollte nie geshadowed werden.
class Thing
{
public:
int Value;
int const & getValue() const interface; // iface? ifc?
};
class MutableThing : public Thing
{
public:
int & getValue(); // könnte auch Interface sein, aber die oben beschriebene Interface-Funktion wird nicht ausgeblendet.
}