2015-03-18 5 views
9

J'ai rencontré un problème lors de l'utilisation d'invariants avec des contrats de code. Je veux définir un Invariant dans ma classe abstraite mais il est simplement ignoré. Le code ci-dessous montre mon interface et la classe abstraite. Par la suite, j'implémente cette interface dans ma classe Point et j'en crée un objet. Cela devrait au moins échouer pendant l'exécution. Lorsque je déplace l'invariant vers la classe de points, cela fonctionne correctement. Toutes les autres conditions préalables ou postales fonctionnent bien aussi.Contrats de code: Invariants dans la classe abstraite

Est-il impossible d'avoir des Invariants dans une classe abstraite ou est-ce que je le fais mal?

+0

Pourquoi? Une classe abstraite n'est pas une interface et ne doit pas commencer par I. –

+0

J'utilise la même sémantique que dans le manuel des contrats de code. Voir le chapitre 2.8 http://research.microsoft.com/fr-fr/projects/contracts/userdoc.pdf – Dynamike

+1

Je vois ... Ce n'est pas I-FooContract, c'est IFoo-Contract. Si c'était moi, je l'écrirais probablement pour être clair, mais il y a peut-être une convention ici ... –

Répondre

2

Les invariants ne sont pas pris en charge sur les interfaces. (Le titre de votre question est "Invariants in abstract class" mais le nœud du problème est l'interface.)

Je suppose que c'est parce que les invariants requièrent un état mais les interfaces n'ont pas d'état. Je suis sûr que l'équipe de contrats de code peut travailler autour de cela et je souhaite qu'ils le feraient parce que ce serait une grande fonctionnalité à avoir.

Pour contourner cette limitation, vous pouvez:

  • Ajoutez la méthode invariante aux classes dérivées (class Point, etc.).
  • Ou, ajoutez setters aux propriétés de la classe abstraite et implémentez la logique de contrat dans les setters. Pourquoi nommez-vous une classe abstraite avec une sémantique d'interface?