Проблема с использованием композиции для отношений «является — а»

У меня есть система, разрабатываемая для системы управления персоналом. Есть бухгалтеры и программисты. В течение первого месяца прихода в компанию сотруднику не дается никакой роли. Один сотрудник может быть бухгалтером и программистом одновременно. У меня есть дизайн, показанный следующим кодом.

Теперь мне нужно улучшить систему, внедрив новый функционал :

Terminate all Accountants. (Terminate means set status of employee as IsActive = false). The issue is I cannot set all accountants directly as inactive without checking. I need to check whether he has got any other role.

. Как переделать эти классы, чтобы сделать функцию завершения более естественной ООП?

ОБНОВЛЕНИЕ

Я ищу ответ, в котором есть модель решения EF Database First и схема базы данных для ответа @AlexDev.

С #Код

List allAccountants =  Get All accountants from database

public class Employee
{
    public int EmpID { get; set; }
    public DateTime JoinedDate { get; set; }
    public int Salary { get; set; }
    public bool IsActive { get; set; }
}


public class Accountant : Employee
{
    public Employee EmployeeData { get; set; }
}

public class Programmer : Employee
{
    public Employee EmployeeData { get; set; }
}

enter image description here

@AlexDev Ответ

public class Employee
{
...
IList Roles;
bool isActive;

public void TerminateRole(Role role)
{
    Roles.Remove(role);
    if(Roles.Count == 0)
    {
        isActive = false;
    }
}
}

public class Role
{
 abstract string Name { get;}
}

public class ProgrammerRole : Role
{
 override string Name { get { return "Programmer"; } }
}

ССЫЛКА

  1. Подход DDD к доступу к внешней информации
  2. Предпочитаете композицию наследованию?
  3. Наследование и свойства перечисления в модели предметной области
  4. Entity Framework :Получение объектов подкласса в репозитории

7
задан Community 23 May 2017 в 10:32
поделиться