我会尝试更清楚地解释我的问题,因为标题有点模糊。我有一个基类,它有一些属性。让我们这样说:
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)
编辑:这些类用于筛选报表查询,purposes.Base类定义基本筛选器,每个类定义特定于报表的筛选器。
发布于 2011-02-23 12:02:00
这完全取决于您的架构。我能想到在核心框架中至少有一个类有几十个,可能是几百个派生类,其中许多派生类只添加一个或两个字段,而许多派生类甚至不添加字段,只有一个子类,以便为自己的特定于应用程序的抽象提供一个更好的名称或基类。这个类的名称是什么?System.Exception
另一个例子可能是System.Web.Mvc.Controller,尽管它比System.Exception更具伸缩性(我特意省略了System.Object和System.ValueType )。
你没有提供任何真实的例子,所以答案是,是的,它可以是合适的,但也可能不是。如果你试图做一个通用的数据输入,其中你有“经理”和“雇员”,它们是从"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会很有用。你确定你不能使用仍然运行在2.0CLR上的.net 3.5吗?
发布于 2011-02-23 12:04:54
不知道你的问题的确切性质。这不是你是否需要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分,希望能有所帮助
发布于 2011-02-23 12:07:52
您所描述的内容对我来说听起来很好--您的每个报告都有一个描述特定于该报告的筛选器的类,因此如果您有70个报告,那么您将有70个类。
就像您所说的,另一种选择是使用字典,这有它自己的缺点(首先它不是强类型的)。
在不了解体系结构的情况下建议其他替代方案是很棘手的(每个报告都有自己的类来显示/检索报告吗?如果是这样的话,也许你可以重构,这样属性就在那个类上,使用属性来识别过滤器参数)。
简而言之-如果你没有其他选择,那么它不可能是糟糕的设计!:-)
https://stackoverflow.com/questions/5086808
复制相似问题