Code Contracts: Invarianten in der abstrakten Klasse

9

Ich habe ein Problem bei der Verwendung von Invarianten mit Code-Verträgen festgestellt. Ich möchte eine Invariante innerhalb meiner abstrakten Klasse definieren, aber sie wird einfach ignoriert. Der folgende Code zeigt meine Schnittstelle und die abstrakte Klasse.

%Vor%

Anschließend implementiere ich diese Schnittstelle innerhalb meiner Point-Klasse und erstelle ein Objekt daraus. Dies sollte zumindest während der Laufzeit fehlschlagen.

%Vor%

Wenn ich die Invariante in die Point-Class verschiebe, funktioniert das gut. Alle anderen Vor- oder Nachbedingungen funktionieren auch.

Ist es nicht möglich, Invarianten in einer abstrakten Klasse zu haben oder tue ich das falsch?

    
Dynamike 18.03.2015, 13:41
quelle

1 Antwort

2

Invarianten werden nicht an Schnittstellen unterstützt. (Der Titel Ihrer Frage lautet "Invarianten in der abstrakten Klasse", aber der Kern des Problems liegt in der Schnittstelle.)

Ich vermute, dass Invarianten einen Zustand benötigen, aber Schnittstellen keinen Zustand haben. Ich bin mir sicher, dass das Code-Contract-Team das umgehen kann und ich wünschte, sie würden es tun, weil dies ein großartiges Feature wäre.

Um diese Einschränkung zu umgehen, könnten Sie:

  • Fügen Sie den abgeleiteten Klassen die invariante Methode hinzu ( class Point , etc.).
  • Oder fügen Sie den abstrakten Klasseneigenschaften Setter hinzu und implementieren Sie die Vertragslogik in den Setter.
Keith 20.03.2015, 12:47
quelle