O que é melhor abordagem na concepção desta classe abstrata? (Parte 1)
-
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?
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.