Объектно-ориентированный дизайн для трех типов, два из которых точно такие же

#c# #oop #design-patterns

#c# #ооп #шаблоны проектирования

Вопрос:

У меня есть три типа людей:

     Class Normal
{
    string FirstName { get; set; }
    int Age { get; set; }
}

    Class Better
{
    string FirstName { get; set; }
    int Age { get; set; }
}

    Class Best
{
    string FirstName { get; set; }
    int Age { get; set; }
    string Address { get; set; }
    int Score { get; set; }
}
  

каков наилучший способ поместить их в один список?
Я сам придумал:

  public enum PersonType
{
    Normal = 0,
    Better = 1,
    Best  = 2
}

public interface IPerson
{
    PassengerType Type { get; set; }
    string FirstName { get; set; }
    int Age { get; set; }
}
  

И затем

 public class Person:IPerson
{
    public PassengerType Type { get; set; }
    public string FirstName { get; set; }
    public int Age { get; set; }
}
  

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

 public class Best:IPerson
{
    public PassengerType Type { get; set; }
    public string FirstName { get; set; }
    public int Age { get; set; }
    public string Address { get; set; }
    public int Score { get; set; }
}
  

и в конечном итоге: Список….

Это хороший дизайн? что делать, если создан «лучший» экземпляр, но для типа установлено значение Normal. это был бы плохой дизайн?

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

1. Добро пожаловать в SO. Какой язык программирования вы используете?

2. C # — это язык моего выбора

Ответ №1:

В общем, сравнения типа класса будет достаточно. Ваш код может выглядеть примерно так:

 public class BasePerson
{
    public string FirstName { get; set; }
    public int Age { get; set; }
}

public class NormalPerson : BasePerson
{   
}

public class BetterPerson : BasePerson
{    
}

public class BestPerson : BasePerson
{
    string Address { get; set; }
    int Score { get; set; }
}
  

И список:

 IList<BasePerson> list = new List<BasePerson>();
list.Add(new NormalPerson());
list.Add(new BetterPerson());
list.Add(new BestPerson());
  

Наконец, используя GetType() typeof() методы и, вы всегда можете определить реальный тип, на который BasePerson ссылается переменная

 BasePerson person = new NormalPerson();
var isNormalPerson = person.GetType() == typeof(NormalPerson);
// isNormalPerson is true
var isBestPerson = person.GetType() == typeof(BestPerson);
// isBestPerson is false
  

Если вам нужно использовать PersonType enum, вы можете изменять классы таким образом:

 public abstract class BasePerson
{
    public string FirstName { get; set; }
    public int Age { get; set; }

    public abstract PersonType Type { get; }
}

public class NormalPerson : BasePerson
{
   public override PersonType Type
   {
      get { return PersonType.Normal; }
   }
}

public class BetterPerson : BasePerson
{
   public override PersonType PersonType
   {
      get { return PersonType.Better; }
   }
}

...