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.Quelle est la meilleure approche pour concevoir cette classe abstraite? (Partie 2)
La relation entre ces deux classes est relation de plusieurs à une. Avec la conception OO
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 abstract List<Tenant> Get();
}
public class ApplicationTenant: Tenant
{
public ApplicationTenant() { }
public override Int32 ID
{
get { return id; }
set { id = value; }
}
public override String Name
{
get { return name; }
set { name= value; }
}
public override List<Tenant> Get()
{
...
}
}
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 abstract List<Customer> Get();
}
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; }
}
public override List<Customer> Get()
{
...
}
...
}
ci-dessus, nous savons que la méthode des besoins List<Tenant> Get()
à overrided.
mais la question sont:
1) La valeur de retour de la commande Get() dans le CorporateCustomer va toujours être List<CorporateCustomer>.
Il meeans que je dois passer outre List<Tenant> Get()
sans être mise en œuvre et créer une autre méthode suivante
2) Si je remplace de toute façon cette méthode ci-dessus et sur le retun je viens de la lancer ... ça ne marchera pas de toute façon. ? !!? ACESI coulée à List<CorporateCustomer>
de List<Customer>
3) La propriété ci-dessous:
public override Tenant Tenant
{
get { return tenant; }
set { tenant= value; }
}
signifie encore une fois, je dois passer outre ce BUTI ne pas que je vraiment utilisé cette cause le CorporateCustomer va toujours être utilisé à la place du ApplicationTenant comme retour PAS locataire.
public CorporateTenant Tenant
{
get { return corprateTenant; }
set { corprateTenant= value; }
}
Alors, est-ce le bon design? Parce que c'est un peu le gaspillage de l'abstraction.
Certaines personnes suggèrent d'utiliser Generic abstract class à la place, mais je ne suis pas sûr que cela puisse aider de toute façon.
J'ai apprécié vos commentaires.
Merci
Dans ce cas, je ne devrais pas définir l'abstraction pour les méthodes Get() ainsi que la propriété du locataire sur la classe Customer ... correct? Vous savez que ce sera sympa de mettre ces propriétés Get() et Tenant parce que ça a du sens BUt ce que j'ai trouvé est que l'implémentation de la classe abstraite Customer qui est CorporateCustomer est requise Get() et Tenant BUT implémentation légèrement différente dans rapport à la valeur de retour. – dcpartners
Oui, vous pouvez conserver l'implémentation de base dans la classe de base (Customer) et remplacer la ou les méthodes requises dans la classe concrète (CorporateCustomer) lorsque le comportement sera différent. Je voudrais également vous recommander d'utiliser des interfaces de manière suivante, Iaide définit des méthodes pour interagir avec tout client, classe abstraite client implémente l'interface Iaide et fournit la mise en œuvre de base, une classe de béton comme CorporateCustomer étend la classe client et remplace/réutilise fonctionnalités fournies par classe de client. – Chetan
En abstraction, vous pouvez remplacer à l'intérieur des méthodes MAIS pas la valeur de retour ainsi que la variable passante. C'est là que je me bats un peu. – dcpartners