¿Cuál es el mejor enfoque para diseñar esta clase abstracta? (Parte 1)

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

  •  10-07-2019
  •  | 
  •  

Pregunta

Digamos que tengo una clase abstracta llamada: Inquilino y Cliente. El inquilino en este caso es como el propietario de la aplicación para el modelo de aplicación de inquilinos múltiples

La relación entre estas 2 clases es una relación de Muchos a Uno.

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


  ...

}

El problema con este diseño es que cuando lo haces:

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

El inquilino en este caso siempre hace referencia al inquilino público Inquilino {get; conjunto; } que en realidad es lo que quiero es el de ApplicationTenant NO el único abstracto.

¿Debo eliminar cualquier abstracción en esta clase Cliente si se trata de otros objetos? ¿Cuál es tu pensamiento?

¿Fue útil?

Solución

O use genéricos en su clase de Cliente.

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

Otros consejos

¿Quiere decir que desea acceder a la implementación concreta Propiedades de ApplicationTenant en lugar de simplemente obtener la clase abstracta Tenant? Si está seguro de que el inquilino es del tipo ApplicationTenant, puede emitirlo, es decir,

ApplicationTenant appTenant = (ApplicationTenant)customer.Tenant;

luego use las características de ApplicationTenant.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top