如何最好地创建一组列表类来匹配我的业务对象

时间:2010-05-21 21:54:50

标签: c# inheritance list collections generics

我在解决需要为每个业务对象实现一些重写函数的列表的问题的最佳方法上有点模糊。

这是设置: 我有一个baseObject来设置数据库,并有适当的Dispose()方法 我的所有其他业务对象都从它继承,如有必要,重写Dispose()

其中一些类还包含其他对象的数组(列表)。所以我创建了一个包含这些列表的类。我知道我可以使用通用List,但这不会让我添加像Dispose()这样的额外功能,所以它会循环并清理。

因此,如果我有名为User,Project和Schedule的对象,我会创建UserList,ProjectList,ScheduleList。

过去,我只是将这些继承自List<>使用相应的类命名,然后编写我希望它具有的一堆常用函数,如Dispose()。

这意味着我会手动验证这些List类中的每一个都有相同的方法集。其中一些类具有非常简单的这些方法版本,可以从基类列表继承。

我可以编写一个接口,强制我确保每个List类具有相同的功能,但接口不允许我编写一些列表可能覆盖的公共基本函数。

我曾尝试编写一个继承自List的baseObjectList,然后让我的其他Lists从中继承,但是存在问题(这就是我来这里的原因)。其中一个尝试将Find()方法与谓词一起使用。

我已经将问题简化为仅讨论Dispose()方法在列表中循环并处理其内容,但实际上,我还有其他几个常用函数,我希望我的所有列表都有。< / p>

解决这个组织问题的最佳做法是什么?

-------- edit ---添加了一个我正试图用更好的方法清理的示例类 - 下一个代码块来自我的AppVarList类,它直接从List继承。现在我在这些列表上有各种样式,因为我正在尝试找到管理所有这些并整合代码的最佳方法:

[Serializable]
public class AppVarList : List<AppVar>
{
    private bool is_disposed = false;
    private bool _NeedsSaving = false;

    // Returns the AppVar, by name
    public AppVar this[string index]
    {
        get { return this.Find(f => f.Key == index); }
        set { this[this.FindIndex(f => f.Key == index)] = value; }
    }

    public AppVarList() { }

    // instantiates the object and connects it to the DB 
    // and populates it
    internal AppVarList(ref DBLib.DBAccess DA)
    {
        DataSet ds = 
            AppVar.SQLSelect(ref DA, 0, 0, false, "", "", "", "");

        foreach (DataRow dr in ds.Tables[0].Rows)
        {
            this.Add(new AppVar(ref DA, dr));
        }
        // Destroy the dataset object
        if (ds != null)-

3 个答案:

答案 0 :(得分:1)

您当然可以将一些功能提升到基类中:

[Serializable]
public class BaseDataList<T> : List<T>
    where T : BaseObject // this is the key line, it ensure that
                         // T is a BaseObject so you can call 
                         //BaseObject methods on T, should allow for you
                         //to put more implementation in this class than
                         // you could otherwise
{
    private bool is_disposed = false;
    private bool _NeedsSaving = false;

    ///this assumes that key is a property on BaseObject that everything implements
    public T this[string index]
    {
        get { return this.Find(f => f.Key == index); }
        set { this[this.FindIndex(f => f.Key == index)] = value; }
    }

    public BaseDataList() { }

    // instantiates the object and connects it to the DB 
    // and populates it
    internal BaseDataList(ref DBLib.DBAccess DA)
    {
        DataSet ds = GetDataSet();

        foreach (DataRow dr in ds.Tables[0].Rows)
        {
            this.Add(new T(ref DA, dr));
        }
        // Destroy the dataset object
        if (ds != null)//...
    }
    //abstract methods for extensibility...
   protected abstract GetDataSet();
}

显然这只是一个粗略的草图,因为我不知道您的所有要求,但是根据BaseObject中共享的实现数量,您可以将大量功能放入BaseDataList中(您可以随意选择一个更好的名字)。那么你所有的其他列表都可以从BaseDataList派生出来。

例如,如果BaseObject实现了IDisposable,您可以将此方法添加到您的类

protected void Dispose()
{
    is_disposing = true;
    foreach(T item in this)
    {
        item.Dispose();
    }
}

然后你只需要写一次

答案 1 :(得分:0)

您应该创建一个继承自System.Collections.ObjectModel.Collection<T>

的公共通用基类

答案 2 :(得分:0)

最好的办法是在IEnumerable集合中添加扩展方法,即

public static ScheduleListExtentions
{
    public static IEnumerable<ScheduleList> DoSomething(this IEnumerable<ScheduleList> mylist){
       //Act on your collection in some mannor here
       return mylist;
    } 
}