Eine häufige Methaper zur Beschreibung von Interfaces ist jene, welche ein Interface mit einer Vereinbarung gleichsetzt eine Vereinbarung, welche Methoden vorgibt, die von einer bestimmten Klasse zu implementieren sind. Über die Semantik dieser Methoden kann dabei jedoch keine Vereinbarung getroffen werden. Genau an dieser Stelle kommen Code Contracts ins Spiel, indem Sie es erlauben, Zusicherungen für Attribute und Parameter zu definieren, welche zu Beginn und/oder Ende einer Methodenausführung zutreffen müssen.
Beispielsweise könnte somit definiert werden, dass eine Methode einen positiven Wert zurückgeben muss, wenn der übergebene Wert ebenfalls positiv ist.
Da Code Contracts allerdings als herkömmliche Anweisungen innerhalb von Methoden hinterlegt und erst im Zuge der Übersetzung extrahiert werden, stellt sich die Frage, wie man solche Zusicherungen für Methoden für Interfaces definiert. Die Lösung hierzu ist relativ pragmatisch: Es wird eine nicht-abstrakte Dummy-Implementierung des jeweiligen Interfaces angelegt. Diese Dummy-Implementierung wird als Contract Class bezeichnet. In den jeweiligen Methoden werden die gewünschten Contracts definiert. Anschließend wird sie mit dem Interface über ein Attribut in Verbindung gesetzt und umgekehrt. Das Interface erhält dazu ein Attribut ContractClass, welches auf den Typ der Contract Class verweist; die Contract Classe wird mit dem Attribut ContractClassFor markiert, welches auf den Typ des Interfaces verweist. Für abstrakte Klassen ist dabei analog vorzugehen.
Das folgende Beispiel soll dies demonstrieren.
[ContractClass(typeof(IStarShipContractClass))]
interface IStarShip
{
void BeamUp(int persons);
}
[ContractClassFor(typeof(IStarShip))]
class IStarShipContractClass : IStarShip
{
void IStarShip.BeamUp(int persons)
{
Contract.Requires(persons > 0);
}
}