设计这个抽象类的最佳方法是什么? (第1部分)

时间:2009-10-29 06:11:09

标签: c#-2.0

假设我有一个名为“Tenant and Customer”的抽象类。在这种情况下,租户就像多租户应用模型的应用程序的所有者

这两个阶级之间的关系是多对一的关系。

public abstract class Tenant
{
  protected Int32 id;
  protected String name;

  public Int32 ID { get; set; }
  public String Name { get; set; }

  public abstract bool Add();
  public abstract bool Update();
  public abstract bool Delete(); 
}

public class ApplicationTenant: Tenant
{
  public ApplicationTenant() { }

  public override Int64 ID
  {
     get { return id; }
     set { id = value; }
  }

  public override String Name
  {
     get { return name; }
     set { name= value; }
  }

  ...

}

public abstract class Customer
{
  protected Int32 id;
  protected String name;
  protected Tenant tenant;

  public Int32 ID { get; set; }
  public String Name { get; set; }
  public Tenant Tenant { get; set; }

  public abstract bool Add();
  public abstract bool Update();
  public abstract bool Delete(); 
}

public class CorporateCustomer : Customer
{
  public CorporateCustomer () { }

  public override Int64 ID
  {
     get { return id; }
     set { id = value; }
  }

  public override String Name
  {
     get { return name; }
     set { name= value; }
  }

  public override Tenant Tenant
  {
     get { return tenant; }
     set { tenant= value; }
  }


  ...

}

这种设计的问题在于:当你这样做时:

CorporateCustomer customer = new CorporateCustomer();
customer.Tenant.ID = xx

在这种情况下,租户总是引用公共租户租户{get;组;实际上我想要的是来自ApplicationTenant的那个而不是一个抽象的那个。

如果它与其他对象有关,我应该删除此类Customer中的任何抽象吗?你的想法是什么?

2 个答案:

答案 0 :(得分:1)

您是否想要访问具体实现ApplicationTenant属性而不仅仅是获取租户抽象类?如果您确定承租人是ApplicationTenant类型,您可以投下它,即

ApplicationTenant appTenant = (ApplicationTenant)customer.Tenant;

然后使用ApplicationTenant的功能。

答案 1 :(得分:1)

或在您的Customer类中使用泛型。

public abstract class Customer<TTenant> where TTenant: Tenant
{
  protected Int32 id;
  protected String name;
  protected TTenant tenant;

  public Int32 ID { get; set; }
  public String Name { get; set; }
  public TTenant Tenant { get; set; }

  public abstract bool Add();
  public abstract bool Update();
  public abstract bool Delete(); 
}