Попытка избежать нескольких подтипов в структуре класса - PullRequest
1 голос
/ 24 февраля 2012

У меня есть два абстрактных класса Business & Person.Проблема в том, что у меня есть тип клиента, который может быть либо бизнес, либо личность.Есть ли способ смоделировать это так, чтобы у меня не было классов CustomerBusiness и CustomerPerson?Множественное наследование не вариант, так как это C #.Я так долго смотрю на это, что не вижу леса за деревьями.

public abstract class Business {
  public string Name { get; set; }
}

public abstract class Person {
  public string FirstName { get; set; }
  public string LastName { get; set; }
  public string MiddleName { get; set; }
  public DateTime? BirthDate { get; set; }
  public string Comments { get; set; }
}

public class CustomerBusiness : Business, CustomerRoles {
  public bool BillTo { get; set; }
  public bool ShipTo { get; set; }
  public bool DeliverTo { get; set; }
  public EntityType Type { get; set; }
}

public class CustomerPerson : Person, CustomerRoles {
  public bool BillTo { get; set; }
  public bool ShipTo { get; set; }
  public bool DeliverTo { get; set; }
  public EntityType Type { get; set; }
} 

public interface CustomerRoles {
  bool BillTo { get; set; }
  bool ShipTo { get; set; }
  bool DeliverTo { get; set; }
}

Ответы [ 2 ]

2 голосов
/ 25 февраля 2012

Вы можете предпочесть композицию, а не наследование с классами Business и Person "иметь" ICustomerRoles вместо "is" ICustomerRoles.

public class Business
{
    public string Name { get; set; }

    public ICustomerRoles CustomerRoles { get; set; }
}

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string MiddleName { get; set; }
    public DateTime? BirthDate { get; set; }
    public string Comments { get; set; }

    public ICustomerRoles CustomerRoles { get; set; }
}
1 голос
/ 24 февраля 2012

Я бы сказал, что у вас иерархия в неправильном порядке. Customer должен быть базовым классом, а затем Business и Person должны быть реализациями класса Customer. Я уверен, что есть больше атрибутов Customer, которые являются общими для всех типов Customer, кроме атрибутов в интерфейсе CustomerRoles.

Я бы подумал, что будут такие вещи, как CustomerCode и т. Д. Также вы можете заявить, что у всех клиентов есть свойство Name, и каждый получатель может получить соответствующее значение для каждого получателя. Как и в Business, у него было бы одно свойство с именем Name, тогда как у человека было бы каждое из FirstName, MiddleName, Surname, а также свойство Name, которое каким-то образом объединял бы их.

...