Каков наилучший подход к разработке этого абстрактного класса? (Часть 1)
Допустим, у меня есть абстрактный класс: Tenant and Customer. Арендатор в этом случае подобен владельцу приложения для мультитенантной модели приложения.
Отношения между этими двумя классами являются отношениями "многие к одному".
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, если он связан с другими объектами? Что ты думаешь?
2 ответа
Или используйте дженерики в своем классе 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 Properties, а не просто получить абстрактный класс Tenant? Если вы уверены, что Арендатор имеет тип ApplicationTenant, вы можете просто разыграть его, т.е.
ApplicationTenant appTenant = (ApplicationTenant)customer.Tenant;
затем используйте функции ApplicationTenant.