我会更清楚地解释我的问题,因为标题有点模糊。我有基类,有一些属性。我们这样说:
public class BaseClas
{
public int Property1 { get; set; }
public bool Property2 { get; set; }
..............................
}
我有大约70个继承自基类的类,这些类中的大多数只添加一个或两个字段,例如:
public class DerivedClas1 : BaseClass
{
public bool PropertyNew1 { get; set; }
}
public class DerivedClas2: BaseClass
{
public bool PropertyNew2 { get; set; }
}
我的问题是我有70个类,每个类只有一个类型为bool或int或datetime等的新字段。我的问题是:以某种方式组合这些类是一个很好的架构设计吗?如果是这样,我应该如何组合它们?我可以使用某种Dictionary<string,object>
,但这不是一个好主意。有什么建议吗?
(我正在使用.Net 2.0)
编辑:这些类用于过滤查询以进行报告。基类定义基过滤器,每个类定义特定于报告的过滤器。
答案 0 :(得分:4)
这完全取决于您的架构。我可以想到核心框架中至少有一个类有几十个,可能有几百个派生类,其中很多只添加一个或两个字段,而且许多甚至不这样做,只有子类才能提供更好的它自己的特定于应用程序的抽象的名称或基类。这个班的名字? System.Exception
另一个例子可能是System.Web.Mvc.Controller,虽然它比System.Exception更加拉伸(我故意遗漏了System.Object和System.ValueType)。
你没有提供任何真实的例子,所以答案是肯定的,它可能是合适的,但也许不是。如果您正在尝试进行通用数据输入,其中“Manager”和“Employee”派生自“Person”,而“Person”又来自“DataObject”,这可能是合适的,但我会考虑其他方式,例如:摆脱“DataObject”并拥有多个提供数据库操作的专用服务,但同样,它取决于整个图片。
编辑:您刚刚澄清了它是否有过滤功能。在这种情况下,您不能使用只定义过滤器类型的系统吗?
public abstract class Filter {
}
public class OrFilter : Filter {
public string Clause1 {get; set;}
public string Clause2 {get; set;}
}
public class ItemMustExistFilter : Filter {
public string ItemName {get; set;}
}
public class Report {
// For the sake of the example, I know that public setters on Lists are not
// best practice
public IList<Filter> Filters {get;set;}
}
这样,您只需要过滤器本身的具体类,每个报告都有一个列表。将它与泛型的使用相结合(参见ram的答案),你应该有一个非常“轻量级”的系统。很遗憾你在.net 2上,否则Dynamic LINQ会很有用。当然你不能使用.net 3.5,它仍然在2.0 CLR上运行?
答案 1 :(得分:1)
不知道问题的确切性质。这不是一个问题,你是否需要70个课程,更多的是准确描述手头问题,良好的设计和可维护性的问题。仿制药有帮助吗?
public class BaseClass
{
/* some basic properties go here*/
}
public class BaseClass<T>:BaseClass
{
T SomeSpecificProperty {get;private set;}
}
因此,当您需要“特定”课程时,您将拥有
var myObj = new BaseClass<Bool>();
如果您想要“装饰”您的课程,您还应该查看Decorator pattern。看看DoFactory Example
我的2美分,希望它有所帮助
答案 2 :(得分:0)
您所描述的内容对我来说听起来不错 - 您的每个报告都有一个描述该报告特定过滤器的类,因此如果您有70个报告,那么您将有70个课程。
就像你说的那样,替代方法就是做一些类似于字典的东西,它有一套自己的缺点(从一开始就没有强类型)。
在不了解更多关于结构的情况下建议其他备选方案很棘手(每个报告都有自己的类用于显示/检索报告吗?如果是这样,也许你可以重构,所以属性就在那个类上,使用属性来识别过滤器参数)。
简而言之 - 如果你没有其他选择,那么设计就不错了! : - )