抽象DataTables和DataRows

时间:2013-06-06 08:55:18

标签: datatable abstract abstraction datarow

我的BLL中的每个班级都有以下功能:

private void FillList()
{
    MyDataSet.MyDataTable dt = MyTableAdapter.GetList();
    foreach (MyDataSet.MyDataRow row in dt)
    {
       this.List.Add(new MyClass(row));
    }

}

MyDataSet对于所有类都是相同的。

MyTableAdapter,MyDataTable,MyDataRow,MyClass - 每个班级都会发生变化。

但是,它看起来像是在复制代码。

如何使FillList成为一个抽象函数并由每个类继承它?

谢谢。

1 个答案:

答案 0 :(得分:0)

如果要创建abstract方法,则必须更改其可见性,因为必须在具体类(子项)中实现抽象方法。因此,儿童必须能够使用这种方法。

这是父类中的conde(总是抽象的):

abstract class Parent
    {
        protected abstract void FillList();
    }

以下是achild类(实现)的代码示例

class Child:Parent
{
    protected override void FillList()
    {
        MyDataSet.MyDataTable dt = MyTableAdapter.GetList();
        foreach (MyDataSet.MyDataRow row in dt)
        {
           this.List.Add(new MyClass(row));
        }
    }
}

正如你在这里看到的那样,抽象方法更像是一个合同,确保孩子们必须实现它。 (请注意,您可以将interfaces用于此目的。)

更有用的解决方案,是为MyDataTable(全部实施GetList),MyDataRow ...创建共同父母,并拆分方法

class Parent
{
    protected void FillList()
    {
        MyDataSet.MyParentDataTable dt = MyParentTableAdapter.GetList();
        foreach (MyDataSet.MyParentDataRow row in dt)
        {
           this.List.Add(getMyClass(row));
        }
    }
    protected abstract MyParentClass getNewMyClass(MyDataSet.MyParentDataRow row);

}

class Child:Parent
{

    protected override MyParentClass getNewMyClass(MyDataSet.MyParentDataRow row)
    {
          return new MyClass(row)
    }

}

最后一个例子快速而且很脏:你必须从孩子那里获取List,你应该考虑使用泛型,但是它可以让你知道什么是可能的。