Was ist am besten Ansatz auf diese abstrakte Klasse entwerfen? (Teil 1)

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

  •  10-07-2019
  •  | 
  •  

Frage

Lassen Sie uns sagen, dass ich abstrakte Klasse namens: Mieter und Kunden. Der Mieter ist in diesem Fall wie Eigentümer der Anwendung für Multi Tenant Anwendungsmodell

Die Beziehung zwischen diesen 2-Klasse sind eine Beziehung Viele.

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


  ...

}

Das Problem bei dieser Konstruktion ist, dass, wenn Sie tun:

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

Mieter in diesem Fall immer die Öffentlichkeit Mieter Mieter Referenzierung {get; einstellen; }, Welche eigentlich ist das, was ich will, ist derjenige von ApplicationTenant nicht den abstrakten ein.

Soll ich jede Abstraktion in dieser Klasse Kunden entfernen, wenn sie andere Objekte sind im Zusammenhang? Was ist Ihr Gedanke?

War es hilfreich?

Lösung

oder verwendet Generika in Ihrer Customer-Klasse.

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

Andere Tipps

Haben Sie meinen Sie die konkrete Umsetzung ApplicationTenant Eigenschaften zugreifen möchten, anstatt nur die Mieter abstrakte Klasse zu bekommen? Wenn Sie sicher sind die Mieter vom Typ ApplicationTenant ist, können Sie einfach werfen es heißt.

ApplicationTenant appTenant = (ApplicationTenant)customer.Tenant;

verwenden Sie dann die Eigenschaften ApplicationTenant.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top