Quelle est la meilleure approche pour concevoir cette classe abstraite? (Partie 1)

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

  •  10-07-2019
  •  | 
  •  

Question

Disons que j’ai une classe abstraite appelée: Locataire et Client. Le locataire dans ce cas est comme le propriétaire de l'application pour le modèle d'application multi-locataire

La relation entre ces 2 classes est une relation plusieurs à un.

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


  ...

}

Le problème avec cette conception est que lorsque vous procédez ainsi:

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

Dans ce cas, le locataire fait constamment référence au locataire locataire locataire {get; ensemble; } ce qui est en fait ce que je veux, c’est celui de ApplicationTenant, PAS celui qui est abstrait.

Dois-je supprimer toute abstraction dans cette classe Client si elle concerne d'autres objets? Quelle est votre pensée?

Était-ce utile?

La solution

Ou utilisez des génériques dans votre classe de client.

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

Autres conseils

Voulez-vous dire que vous souhaitez accéder à la mise en oeuvre concrète ApplicationTenant Properties plutôt que de simplement obtenir la classe abstraite Tenant? Si vous êtes certain que le locataire est de type ApplicationTenant, vous pouvez simplement le lancer i.e.

ApplicationTenant appTenant = (ApplicationTenant)customer.Tenant;

utilisez ensuite les fonctionnalités de ApplicationTenant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top