2012-02-24 2 views
1

У меня есть два абстрактных классов Бизнес & Лицо. Проблема в том, что у меня есть тип клиента, который может быть либо Бизнесом, либо Лицом. Есть ли способ моделировать это, чтобы у меня не было классов 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

Вы могли prefer composition over inheritance имея в Business и Person классы «имеют» ICustomerRoles вместо «является» 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; } 
} 
+0

Спасибо Эд, я начинаю видеть вашу мысль. Мне нужно уточнить, что я думаю, что мне нужно, чтобы классы Business и Person были абстрактными, поскольку будут другие классы, которые всегда будут иметь свойства Business и Person. Примеры: Поставщик, Отдел, Отдел и т. Д. – Chris

+0

Я не уверен, что смогу использовать этот метод из-за других ограничений (не в моем первоначальном вопросе) в этом проекте, но это решение - лучший ответ I До сих пор. Спасибо, Ed. – Chris

1

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

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

+0

Tobsey, я попробовал ваш подход, но у меня возникли проблемы, когда мне нужно было наследовать свойства Business в другой организации, такой же, как Customer. У вас есть пример реализации, который вы можете мне показать? Может быть, я не буду правильно интерпретировать ваш ответ. – Chris

Смежные вопросы