我目前正在开发一个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();
}
因此,例如,阻止我使用此方法的通用版本从我的数据库填充实体类的原因是,在父表单中定义这些方法时,我必须为没有实现的实体使用基类最后我不能使用通用版本。
让我感到困扰的是,我必须在每个派生表单的实现中一遍又一遍地复制此代码(对于每种此类方法),只是为了将实例设置为特定的实体类。应该有另一种方式,我希望之前有类似情况的人可以帮我找到解决方法..
答案 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