inheritanceList 来实现集合是个坏主意吗?
我曾经读过Imaar Spaanjars关于如何构建3层应用程序的文章。 ( http://imar.spaanjaars.com/416/building-layered-web-applications-with-microsoft-aspnet-20-part-1 )这已成为我编码的基础。
因此,我通过inheritanceList
实现集合。 因此,如果我有一个名为Employee的类,要实现一个集合,我还将有一个Employees类,如下所示。
class Employee { int EmpID {get;set;} string EmpName {get;set;} } class Employees : List { public Employees(){} }
我从未真正质疑这一点,因为它为我做了工作。 但是现在我开始尝试一些事情,我不确定这是否是正确的方法。
例如,如果我想从Employees获得一个子集,例如
Employees newEmployees = (Employees) AllEmployees.FindAll(emp => emp.JoiningDate > DateTime.Now);
这会抛出System.InvalidCastException。 但是,如果我使用以下内容,则没有问题。
List newEmployees = AllEmployees.FindAll(emp => emp.JoiningDate > DateTime.Now);
那么如何实现Employees以便我不必在DAL或BLL中明确使用List
? 或者我怎样摆脱InvalidCastexception?
我不会inheritanceList
– 它引入了类似的问题,并没有真正的帮助(因为没有virtual
方法可以覆盖)。 我要么使用List
(或更抽象的IList
),要么引入多态, Collection
有虚方法。
作为一个说明; 像FindAll
这样的东西,你也可以找到LINQ选项(比如.Where()
)有用的对应物; 最值得注意的是,它们适用于任何 IList
(或IEnumerable
),而不仅仅是List
和子类。
通过对List
进行子分类,您获得了什么好处? 如果它没有添加任何内容,那么它就是不必要的代码膨胀。 如果您没有显示方法或通过您未在此处显示的构造函数强制执行合同,则可能是进行子类化的正当理由。
在解决您的转换问题方面,您不能将List
转发给Employees
因为List
不会从Employees
inheritance。 如果您需要使用您的条件返回Employees,那么您最好封装调用并将返回的列表项插入到您自己的Employees对象中。 这对我来说似乎是浪费时间,除非像我上面所说的那样,你有充分的理由对List
进行子类化。
就个人而言,我尝试尽可能使用IList
,除非他们有理由存在,否则不要创建子类。
一个简单的经验法则是从COMPOSITION开始(例如,围绕一个通用集合包装Employees)并且不是INHERITANCE。 从基于inheritance的设计开始,将自己描绘成一个角落。 组合物更灵活和可修改。
我个人会将列表存储为容器对象的成员,如果necesery提供了列表本身的访问者。
class MyCollection { List _table; public List Table { get { return _table; } } // ... other access/utility functions common for all tables // (CRUD for example) } class Employees : MyCollection { // ... yet more methods }
我必须承认,我这样做是为了给自己提供以下方法:
T FindById(int id); void Add(T entity); void Remove(T entity);
在基类和:
T[] GetEmployeesBy(your_filter_here);
我(仍然)使用.net 2.0所以我没有linq – 也许这就是它的原因。