2011-04-10 77 views
2

我目前正在研究一个C#项目,其中一个主基本形式是由其他几种形式派生的。我使用实体类来处理系统中表示的每个实体的数据操作:项目,wharehouses,帐户等。这意味着每个派生表单都使用它自己的DAO类型。对不同的实体类使用相同的基本形式

我从这些派生形式调用基本功能就好了,我现在正在努力的是这样的:因为每个窗体都有不同的实体类,所以当唯一的区别是每个派生类时我需要一个特定的方法基础和派生形式之间是实体类的类型。

我有这样的事情:

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

     instance1 = adapter1.Populate(id); 

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

因此,例如,是什么阻止我使用这种方法的通用版本,从我的数据库填充实体类是定义在父窗体的方法时,我不得不为我的实体使用基类,因此最终我不能使用通用版本。

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

+0

你能给的更多细节什么INSTANCE1和适配器1是谁? – 2011-04-10 23:47:22

+0

在我的基本表单中,instance1是基本实体类,adapter1是包含所有update/insert/delete方法的数据访问类。我使用实体类作为表格字段的映射只是为了操作数据..所以问题是,在我的基本形式instance1引用所有基本为空的实体的基类,我需要一种方法来调用派生类为每个派生形式。 – Enmanuel 2011-04-10 23:54:17

回答

1

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

+0

我尝试过这种方式,但是您在基本窗体中提到的成员应该有一个类型,并且该类型必须是您的基本实体类,所以事实证明,当您从派生类调用任何特定的方法时,基类是被称为.. – Enmanuel 2011-04-12 01:45:15

+0

不应该。整个继承点(或者至少是一点)是派生类型的对象可以被分配给它的基类型的变量(或者这个例子中的字段),并且该成员访问将会解析为成员覆盖在继承链中最派生的类中。所以如果'Foo'有一个成员'Bar',并且'DerivedFoo'继承'Foo'并且覆盖'Bar',那么'Foo fooVar = new DerivedFoo(); fooVar.Bar();'会执行'DerivedFoo'中声明的'Bar()'方法覆盖。 – 2011-04-12 02:45:33

+0

我不知道为什么,也许我错过了一些东西。但它在基类上有虚拟声明。 – Enmanuel 2011-04-12 20:22:05

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 
+0

似乎是一个很好的方法,无论如何,我的问题在于,每个Populate()的特定实现都将返回一个不同的类型,因为我使用实体类来封装与实体相关的所有数据.. 为此,我在接口定义中为iPopulate()提供了一个基类返回类型,并为每个实现提供了不同的派生类型。 – Enmanuel 2011-05-14 04:14:14

相关问题