2010-02-05 95 views
2

我在数据库中有5个不同的表。我写了一个抽象的“Converter.java”类,它从数据库中取出数据并将其转换为“tree.xml”文件。Java中的继承问题

Tree.xml

<?xml version="1.0" standalone="no"?> 
<tree> 
    <declarations> 
     <attributeDec1 name="name" type="String"/> 
    </declarations> 

    <branch> 
     <attribute name="name" value="process 1"/> 

     <leaf> 
      <attribute name="name" value="process 2"/> 
     </leaf> 

     <leaf> 
      <attribute name="name" value="process 3"/> 
     </leaf> 
    </branch> 
</tree> 

所以你可以猜到,上述tree.xml的结构将保持相同的所有5桌。唯一的区别在于属性“值”的值。

要获取该“值”属性的值,转换器首先必须查询数据库中的这些值。

因此,5个不同的表应该有5个不同的查询。因此,而不是编码5个不同的转换器,我已经作出了singele “Converter.java” 具有的功能类似于

  • openTree()
  • closeTree()
  • openBranch()
  • closeBranc()
  • openLeaf()
  • closeLeaf()
  • 的addAttribute()

在上述方法之外,我实现了除addAttribute()方法以外的所有方法,因为它将根据表执行实现。

在那之后,我已经编写了5个不同的转换器,每一个表,所有的人都伸出“Converter.java”

我做了一个名为作为Converter.java类“查询”字段。由于这个字段被所有5个转换器继承,我已经在这5个转换器的构造函数中初始化了这个字段。

现在我的问题如下:

问:我没有信心,我是否正确使用继承或者应该在上述方法的一些变化?

编辑:

Q2。在Converter.java类中使用“query”字段的方法还有一个。因为该字段没有在Converter.java类中初始化,所以我是否在所有5个子转换器中复制该方法,或者将该方法放在父类中(即Converter.java)

回答

3

我认为战略模式在这里会更合适。您可以创建具有常见行为的非抽象类Converter,并为其提供可以执行特定于表的值检索的ValueSource。然后,您创建一个QueryValueSourceValueSource的子类)以根据指定的查询检索值。

为了得到一个具体的策略,你可以不同的查询进入的QueryValueSource构造函数,或者它的子类来创建特定于表的来源。

+0

这绝对是要走的路。很多时候,人们试图将继承作为自己的设计模式使用,当它可以工作时,选择一种与您尝试做的事情相匹配的设计模式可以在设计,开发,维护以及尝试时提供重要的价值增加增强功能。 – BestPractices 2010-02-06 13:18:40

1

希望我能理解你的问题正确。如果我这样做,那么它听起来像你直接初始化字段,如“mQuery = foo;”在每个构造函数中?如果是这种情况,那么最好的形式可能是仅在超类构造函数中初始化它,然后在每个子类构造函数(如“super(foo);”)中调用该超类构造函数。

0

关于问题Q2:你可以做的是使转换器类的抽象和使用“查询”属性,它的方法提供实现。让Converter子类的构造函数初始化查询属性。

关于Q1,我不能完全理解你所提供的上下文中的问题。可能是一些代码示例会有所帮助。但有了这个,我可以提出的这个有限的理解是你考虑用组合而不是继承会有帮助吗?此外,在我看来,Strategy模式可以在这里使用。