Создать человека (реальное физическое или юридическое лицо) с использованием шаблона проектирования

#c# #design-patterns

Вопрос:

У меня есть класс person :

 public class Person : 
    {
     public Guid Id { get; set; }
     public Guid? PersonRealId { get; set; }
     public Guid? PersonLegalId { get; set; } 
     public virtual PersonReal PersonReal { get; set; }
     public virtual PersonLegal PersonLegal { get; set; }
    }
 

реальный :

  public class PersonReal 
    {
        public Guid Id { get; set; }
        public string Title { get; set; }
        public Guid Sex { get; set; }
        public string FirstName { get; set; }
    }
 

и юридический имеет :

 public class PersonLegal 
    {
        public Guid Id { get; set; }
        public string Title { get; set; }
        public string Name { get; set; }
        public Guid? TopManager { get; set; }
        public string NationalCode { get; set; }
    }
 

лицо всегда относится к реальному или юридическому типу, а не к обоим одновременно.
какой наилучший шаблон для реализации person с использованием шаблона проектирования?

Комментарии:

1. Наследование не выполняет эту работу?

2. Я так не думаю. у них разные свойства, но они люди

3. Зависит от того, что вы хотите с ними сделать. Например: будут ли они использоваться в общем List<Person> , например? Будет ли достаточно (в большинстве случаев), чтобы у них были конкретные ToString реализации? Также: почему TopManager a Guid? , а не a RealPerson ? Если вам нужно обрабатывать их по-разному в разных алгоритмах, имеет ли смысл использовать шаблон double-dispatch-visitor?

4. Являются ли эти объекты в контексте инфраструктуры базы данных / ORM?

5. ^^ «двойная отправка-посетитель» => взгляните на dotnetfiddle.net/ALWuBx

Ответ №1:

Определите перечисление для указания типа пользователей

 public enum PersonTypes{
    Real=0,
    Legal=1,
}
public class Person
{
    public string Id { get; set; }
    public string NationalCode { get; set; }
    public string Title { get; set; }
    public bool Sex { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public PersonTypes Type { get; set; }

    public string ManagerId { get; set; }
    
    [ForeignKey("ManagerId")]
    public virtual Person Manager{ get; set; }
}
 

Комментарии:

1. они обладают совершенно разными свойствами

2. вы могли бы использовать наследование для реализации этого