【问题标题】:Abstracting DataTables and DataRows抽象数据表和数据行
【发布时间】:2013-06-02 04:53:56
【问题描述】:

我的 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 成为一个抽象函数并由每个类继承?

谢谢。

【问题讨论】:

  • 你真的是指抽象吗?或者您想在一个抽象(或非)父级中实现一个可以从其所有子级调用的方法?
  • 两种解决方案都很好。
  • 再问一个问题:DataSet 的目的是什么?
  • DataSet 包含所有类型的DataTables 和TabelAdapters

标签: datatable abstract abstraction datarow


【解决方案1】:

如果你想创建一个abstract 方法,你必须改变它的可见性,因为抽象方法必须在具体类(子类)中实现。因此,孩子们必须有权访问此方法。

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

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

这是一个子类的代码示例(实现)

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)
    }

}

最后一个例子做得又快又脏:你必须列出孩子们可以访问的列表,如果可以的话,你应该考虑使用泛型,但它可以让你知道什么是可能的。

【讨论】:

  • @Yevgenigrinberg 我必须承认我恐怕这不是你所期望的,但是拥有一个可重用的父方法对于你的设计方式来说有点困难。
猜你喜欢
  • 2014-08-13
  • 2012-11-22
  • 2017-06-23
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多