我有一个名为租户和客户的抽象类。在这种情况下,租户就像多租户应用模型的应用程序的所有者。
这两个阶级之间的关系是多对一的关系。
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()
{
...
}
...
}
通过上面的OO设计,我们知道List<Tenant> Get()
的方法需要被覆盖。
但问题是:
1)CorporateCustomer中Get()的返回值始终为List<CorporateCustomer>.
我必须覆盖List<Tenant> Get()
而不实现并创建另一个跟随方法
public List<CorporateCustomer > Get()
{
return ???;
}
2)如果我仍然覆盖上面的这个方法和重新调整我只是投了它......它无论如何都无法工作。 ?!!? Casn从List<CorporateCustomer>
List<Customer>
3)以下属性:
public override Tenant Tenant
{
get { return tenant; }
set { tenant= value; }
}
意味着我必须重写这个BUTI我不是真的使用过这个因为CorporateCustomer总是会被用作ApplicationTenant而不是返回NOT Tenant。
public CorporateTenant Tenant
{
get { return corprateTenant; }
set { corprateTenant= value; }
}
这是正确的设计吗?因为它有点浪费抽象。
有些人建议使用Generic抽象类,但我不确定它是否会有所帮助。
感谢您的反馈。
由于
答案 0 :(得分:0)
抽象概念可以帮助您使代码模块化,它可以帮助模型的客户在其设计中定义正确的抽象,从而避免重复逻辑 我将尝试详细说明这一点,
考虑一个名为CorporateTenantManager
的课程,该课程涉及企业租户管理。此课程将“了解”,表示CorporateTenant
和“CorporateCustomer”课程的存在,因此会处理 Corporate * 类型的内容。
但是现在考虑一个负责对客户进行身份验证的类,该类可能不知道它是什么类型的客户,因此只会用Customer
语言处理。
因此,您不必为每个具体类添加getter-setter。在getter-setters的情况下,类的客户端知道要期待什么,所以即使返回类型是抽象类型,客户端也会将其类型转换为它所期望的具体类。
答案 1 :(得分:0)
似乎你需要将你的担忧分开一些。租户类应负责存储有关单个租户的内容或对单个租户执行某些操作。我真的不明白为什么或如何从单个租户对象返回租户列表。或者Add方法应该做什么。如果你想存储一堆租户,你应该使用某种类型的集合。
如果您没有任何适用于将继承基类的类的特定实现,那么最好使用接口而不是抽象类。
public interface ITenant
{
int ID { get; set; }
string Name { get; set; }
}
public interface ICustomer
{
int ID { get; set; }
string Name { get; set; }
ITenant Tenant { get; set; }
}