ما هو أفضل نهج على تصميم هذه الفئة المجردة؟ (الجزء 1)

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

  •  10-07-2019
  •  | 
  •  

سؤال

ودعونا نقول لدي فئة مجردة يسمى: المستأجر والعميل. المستأجر في هذه الحالة هو مثل صاحب الطلب لعدة المستأجر تطبيق نموذج

والعلاقة بين هذه الفئة 2 كثيرة لعلاقة واحدة.

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

والمستأجر في هذه الحالة هو دائما الرجوع إلى المستأجر المستأجر العام {الحصول؛ جلس؛ } الذي هو في الواقع ما أريده هو واحد من ApplicationTenant ليست واحدة مجردة واحد.

هل يجب إزالة أي التجريد في هذه الفئة العملاء إذا لم المتعلقة أشياء أخرى؟ ما هو الفكر الخاص بك؟

هل كانت مفيدة؟

المحلول

وأو استخدام الأدوية في الصف العملاء الخاص بك.

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