Question

Disons que nous avons une liste d'entités de tâche et un ProjectTask sous-type. Les tâches peuvent être fermées à tout moment, sauf ProjectTasks qui ne peut pas être fermé une fois qu'ils ont commencé. L'interface utilisateur doit assurer l'option pour fermer un démarrage ProjectTask n'est jamais disponible, mais certaines garanties sont présentes dans le domaine:

public class Task
{
     public Status Status { get; set; }

     public virtual void Close()
     {
         Status = Status.Closed;
     }
}

public class ProjectTask : Task
{
     public override void Close()
     {
          if (Status == Status.Started) 
              throw new Exception("Cannot close a started Project Task");

          base.Close();
     }
}

Maintenant, lorsque vous appelez Close() Sur une tâche, il y a une chance que l'appel échoue s'il s'agit d'un ProjectTask Avec le statut démarré, alors qu'il ne le ferait pas s'il s'agissait d'une tâche de base. Mais ce sont les exigences de l'entreprise. Il devrait échouer. Cela peut-il être considéré comme une violation du Principe de substitution de Liskov?

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
scroll top