【问题标题】:Trying to avoid multiple sub-types in a class structure试图避免类结构中的多个子类型
【发布时间】:2012-03-15 02:55:33
【问题描述】:

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

【问题讨论】:

    标签: c# c#-4.0 inheritance interface base-class


    【解决方案1】:

    您可以 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; }
    }
    

    【讨论】:

    • 谢谢 Ed,我开始明白你的意思了。我需要澄清一下,我认为我需要保持 Business 和 Person 类的抽象,因为会有其他类始终具有 Business 和 Person 属性集。例如:供应商、部门、部门等......
    • 由于此项目中的其他限制(不在我的原始问题中),我不确定我是否能够使用此方法,但此解决方案是迄今为止我找到的最佳答案。谢谢,埃德。
    【解决方案2】:

    我会说你的继承顺序是错误的。 Customer 应该是一个基类,然后 Business 和 Person 应该是 Customer 类的实现。我敢肯定,除了 CustomerRoles 界面中的那些之外,所有类型的客户都有更多的客户属性。

    我原以为会有诸如 CustomerCode 之类的东西。您也可以声明所有客户都有一个 Name 属性,并且由每个子类中的 getter 来返回适当的值。就像在企业中会有一个名为 Name 的属性,而一个人将拥有 FirstName、MiddleName、Surname 中的每一个,还有一个 Name 属性,该属性将以某种方式连接这些属性。

    【讨论】:

    • 托布西,我尝试了您的方法,但是当我需要将业务属性继承到另一个实体(例如客户)时遇到了麻烦。您有可以向我展示的示例实现吗?也许我没有正确解释您的答案。
    猜你喜欢
    • 2014-03-22
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    相关资源
    最近更新 更多