2012-02-24 48 views
1

我有两个抽象类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

你可以prefer composition over inheritance具有BusinessPerson班“有” 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

谢谢埃德,我开始看到你的观点。我需要澄清的是,我认为我需要保持业务和人员类的抽象,因为将有其他类将始终具有业务和人员属性集。例如:供应商,部门,部门等... – Chris 2012-02-27 15:27:48

+0

我不确定我能否使用这个方法,因为在这个项目中有其他限制(不是我原来的问题),但这个解决方案是最好的答案到目前为止已经找到了。谢谢,埃德。 – Chris 2012-02-28 13:04:57

1

我会说,你有你的heirarchy在错误的顺序。客户应该是一个基类,然后Business和Person应该是Customer类的实现。我确信除了CustomerRoles界面中的客户以外,所有类型的客户都有一个共同的客户属性。

我原以为会有像CustomerCode等东西。你也可以说,所有的客户都有一个名称属性,这取决于每个子类中的getter返回适当的值。正如在一个企业将有一个名为Name的单一属性,而一个人将有每个FirstName,MiddleName,Surname和一个Name属性,以某种方式连接这些属性。

+0

Tobsey,我想你的方法,但我遇到了麻烦,当我需要继承业务属性合并到另一个实体很像客户。你有一个示例实现,你可以告诉我吗?也许我没有妥善解释你的答案。 – Chris 2012-02-27 15:29:28