2010-07-15 181 views
0

这是我想达到的。然而,在经过一天半的时间后,我几乎相信它是不可能完成的。如果有人能告诉我如何做到这一点,我会很感激。家长共享方法从孩子中提取信息并生成孩子?

我有一个.NET父类父与共享方法Fetch()。提取可以采用各种参数来帮助它知道要提取哪些特定记录,但目前这并不相关。

Fetch()需要知道要查找哪个表以查找其后的记录。对于继承Parent的每个子类,该表是不同的。我想将表名保存在一个属于Child类属性的字符串中。然后,每个Child都可以提供自己的表名,Parent可以处理所有这些都以相同方式工作的Fetching。

一旦它执行查询,Fetch()应该有一个DataReader。所有Child类都有一个构造函数,它可以接收DataReader作为参数,并使用它来生成一个由读者填充属性的实例。

我必须强调一件事: Fetch是一种共享方法。如果我从头开始设计它,我可能不会那么做,但是因为它是我重构了一些绝对的代码,他们去了并且建立了一些绝对的代码(他可能是或者可能不是我2年前)使用Fetch()作为每个Child类的一个共享方法的项目(或者说,我希望将这个类作为这个新Parent的子类),并且确实很好,不必更改那些项目到实例。

编辑: 我正在运行到具体的是,我无法弄清楚如何获得表名入取(),也不知道怎样去确定,以调用其上所产生的DataReader的构造函数的子类。

因此,要回顾:

  • 家长共用fetch()方法
  • 方法在Child.Fetch称为()
  • 家长会从子表信息
  • 取()知道Child的类名,所以它可以用它读取的DataReader调用构造函数。

可以这样做吗?非常感谢。

+0

Ryan,可以做些什么?关键点在哪里? – 2010-07-15 21:39:59

+0

嘿,好问题:所以我发现当我在Fetch()里面的时候,我找不到一种方法从Child中取出表名,这样我就可以从正确的位置获取数据,我也不能确定类孩子。我怀疑这是因为在Shared方法和实例方法中可以做什么的限制。现在有道理吗? – Blumer 2010-07-15 21:45:28

回答

0

父可以拥有一个MustOverride属性,该属性是Child需要实现的,可以包含表信息。这解决了Parent如何知道每个Child需要查找哪个表的问题,但是您不能拥有MustOverride Shared成员,因此您需要Child的实例才能在Parent中使用。

也许你可以在父类上创建一个基于类型参数的正确类型Child的实例的通用Fetch。给出正确的约束条件当然是可能的。

+0

是的,Shared方法的不可重复性是让我在这里绊倒的东西。 在Parent内创建一个Child实例并不坏,但我看不出如何知道要实例化一个实例的子类。思考? – Blumer 2010-07-15 21:52:32

+0

不幸的是,不能不更改Fetch()的方法签名。或者你必须传递给Fetch()一些信息,或者你必须做Fecth()泛型,即Fetch(Of T {New})() – Mark 2010-07-16 18:42:44

0

如果Fetch知道子类的全名,那么它应该能够使用reflection来获得孩子的类型,并且从那里我会期望你会发现它简单的航行。