对不同的实体类使用相同的基本形式

时间:2011-04-10 23:33:48

标签: c# polymorphism

我目前正在开发一个C#项目,其中主要基本表单由其他几种表单派生。我使用实体类来处理系统中表示的每个实体的数据操作:项目,仓库,帐户等。这意味着每个派生表单都使用自己的DAO。

我从这些派生表单调用基本功能就好了,我现在正在讨论的是:因为每个表单都有不同的实体类,我需要一个特定的方法,每个派生类的唯一区别是base和派生形式是实体类的类型。

我有这样的事情:

        int id;
        int.TryParse(key.Text, out id);

        instance1 = adapter1.Populate(id);

        if (instance != null)
        {
            bindingSource.DataSource = instance1;
            this.GoEdit();
            this.MarkDeleted();
        }

因此,例如,阻止我使用此方法的通用版本从我的数据库填充实体类的原因是,在父表单中定义这些方法时,我必须为没有实现的实体使用基类最后我不能使用通用版本。

让我感到困扰的是,我必须在每个派生表单的实现中一遍又一遍地复制此代码(对于每种此类方法),只是为了将实例设置为特定的实体类。应该有另一种方式,我希望之前有类似情况的人可以帮我找到解决方法..

2 个答案:

答案 0 :(得分:1)

如何在基本表单中放置受保护字段以存储基本实体类类型的引用。派生表单的构造函数可以将此字段设置为适当的派生实体类。您问题中的代码基本上可以只是基本形式。

答案 1 :(得分:1)

您似乎可能想要使用interface。这将允许您实现从该接口继承的类,但为Populate函数实现自己的功能。

假设您有以下类结构:

interface iPopulate
{
   void Populate(int id);
}

class MyBaseClass
{
  //whatever
}

class Warehouse : MyBaseClass, iPopulate
{
   void Populate(int id)
   {
       Console.WriteLine("Populate Warehouse");
   }
}

class Items : MyBaseClass, iPopulate
{
   void Populate(int id)
   {
      Console.WriteLine("Populate Item");
   }
}

您可以为每个数据填充数据,而无需指定继承的类。例如:

List<MyBaseClass> stuff = new List<MyBaseClass>();
stuff.Add(new Warehouse());
stuff.Add(new Items());
foreach(MyBaseClass i in stuff)
{
    int someId = 123;
    iPopulate pop = i as iPopulate;
    pop.Populate(someId);
}

这将输出:

Populate Warehouse
Populate Item