O que é melhor abordagem na concepção desta classe abstrata? (Parte 1)

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

  •  10-07-2019
  •  | 
  •  

Pergunta

Vamos dizer que eu tenho classe abstrata chamada: Tenant e Cliente. O inquilino, neste caso, é como proprietário do pedido de modelo de aplicação inquilino múltiplas

A relação entre estas duas classes são muitos para um relacionamento.

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


  ...

}

O problema com este projeto é que, quando você faz:

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

Tenant, neste caso, é sempre referenciando o público Tenant Tenant {get; conjunto; } Que é realmente o que eu quero é o de ApplicationTenant não o que um resumo.

Devo remover qualquer abstração nesta classe cliente se ele está relacionando outros objetos? Qual é o seu pensamento?

Foi útil?

Solução

ou utilização de genéricos em sua classe ao 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(); 
}

Outras dicas

Você quer dizer que você deseja acessar a implementação concreta Propriedades ApplicationTenant em vez de apenas recebendo a classe abstrata inquilino? Se você é certo que o inquilino é do tipo ApplicationTenant, você pode simplesmente lançá-lo i.

ApplicationTenant appTenant = (ApplicationTenant)customer.Tenant;

, em seguida, usar os recursos do ApplicationTenant.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top