Каков наилучший подход к разработке этого абстрактного класса? (Часть 1)

StackOverflow https://stackoverflow.com/questions/1641877

  •  10-07-2019
  •  | 
  •  

Вопрос

Допустим, у меня есть абстрактный класс: 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, если она связана с другими объектами? Что ты думаешь?

Это было полезно?

Решение

Или используйте дженерики в своем классе 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(); 
}

Другие советы

Вы имеете в виду, что хотите получить доступ к конкретной реализации ApplicationTenant Properties, а не просто получить абстрактный класс Tenant? Если вы уверены, что Арендатор имеет тип ApplicationTenant, вы можете просто разыграть его, т. Е.

ApplicationTenant appTenant = (ApplicationTenant)customer.Tenant;

затем используйте функции ApplicationTenant.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top