この抽象クラスを設計する最良の方法は何ですか? (パート1)

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

  •  10-07-2019
  •  | 
  •  

質問

「テナント」と「顧客」という抽象クラスがあるとします。この場合のテナントは、マルチテナントアプリケーションモデルのアプリケーションの所有者のようなものです

これら2つのクラス間の関係は、多対1の関係です。

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


  ...

}

この設計の問題は、次の場合です:

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

この場合のテナントは、常にパブリックテナントを参照しています{get;セット; }これは実際に私が欲しいものは、ApplicationTenantのものであり、抽象的なものではありません。

このクラスCustomerが他のオブジェクトに関連している場合、このクラスの抽象化を削除すべきですか?あなたの考えは?

役に立ちましたか?

解決

またはCustomerクラスでジェネリックを使用します。

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

他のヒント

単にテナントの抽象クラスを取得するのではなく、具体的な実装ApplicationTenantプロパティにアクセスすることを意味しますか?テナントのタイプがApplicationTenantであることが確実な場合、キャストすることができます。つまり、

ApplicationTenant appTenant = (ApplicationTenant)customer.Tenant;

次にApplicationTenantの機能を使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top