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

时间:2009-11-03 05:13:42

标签: oop asp.net-2.0

我有一个名为租户客户的抽象类。在这种情况下,租户就像多租户应用模型的应用程序的所有者。

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

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 abstract List<Tenant> Get();
}

public class ApplicationTenant: Tenant
{  
  public ApplicationTenant() { }  
  public override Int32 ID  
  {  
    get { return id; }     
    set { id = value; }  
  }  
  public override String Name  
  {     
    get { return name; }     
    set { name= value; }  
  }  


  public override List<Tenant> Get()
  {
     ...
  }
}

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 abstract List<Customer> Get();
}

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; }  
  }  

  public override List<Customer> Get()
  {
     ...
  }

  ...
}

通过上面的OO设计,我们知道List<Tenant> Get()的方法需要被覆盖。

但问题是:

1)CorporateCustomer中Get()的返回值始终为List<CorporateCustomer>.我必须覆盖List<Tenant> Get()而不实现并创建另一个跟随方法

  public List<CorporateCustomer > Get()
  {
     return ???;
  }

2)如果我仍然覆盖上面的这个方法和重新调整我只是投了它......它无论如何都无法工作。 ?!!? Casn从List<CorporateCustomer>

投射到List<Customer>

3)以下属性:

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

意味着我必须重写这个BUTI我不是真的使用过这个因为CorporateCustomer总是会被用作ApplicationTenant而不是返回NOT Tenant。

  public CorporateTenant Tenant  
  {     
    get { return corprateTenant; }     
    set { corprateTenant= value; }  
  } 

这是正确的设计吗?因为它有点浪费抽象。

有些人建议使用Generic抽象类,但我不确定它是否会有所帮助。

感谢您的反馈。

由于

2 个答案:

答案 0 :(得分:0)

抽象概念可以帮助您使代码模块化,它可以帮助模型的客户在其设计中定义正确的抽象,从而避免重复逻辑 我将尝试详细说明这一点,

考虑一个名为CorporateTenantManager的课程,该课程涉及企业租户管理。此课程将“了解”,表示CorporateTenant和“CorporateCustomer”课程的存在,因此会处理 Corporate * 类型的内容。
但是现在考虑一个负责对客户进行身份验证的类,该类可能不知道它是什么类型的客户,因此只会用Customer语言处理。

因此,您不必为每个具体类添加getter-setter。在getter-setters的情况下,类的客户端知道要期待什么,所以即使返回类型是抽象类型,客户端也会将其类型转换为它所期望的具体类。

答案 1 :(得分:0)

似乎你需要将你的担忧分开一些。租户类应负责存储有关单个租户的内容或对单个租户执行某些操作。我真的不明白为什么或如何从单个租户对象返回租户列表。或者Add方法应该做什么。如果你想存储一堆租户,你应该使用某种类型的集合。

如果您没有任何适用于将继承基类的类的特定实现,那么最好使用接口而不是抽象类。

public interface ITenant
{
    int ID { get; set; }
    string Name { get; set; }
}

public interface ICustomer
{
    int ID { get; set; }
    string Name { get; set; }
    ITenant Tenant { get; set; }
}