Java中的继承问题

时间:2010-02-05 15:21:05

标签: java design-patterns inheritance

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

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个表都将保持相同。唯一的区别在于属性“值”的值。

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

因此,对于5个不同的表应该有5个不同的查询。因此,我没有编写5个不同的转换器,而是制作了一个具有类似

功能的单元“Converter.java”
  • openTree()
  • closeTree()
  • openBranch()
  • closeBranc()
  • openLeaf()
  • closeLeaf()
  • 的addAttribute()

在上面的方法中,我已经实现了除addAttribute()方法之外的所有方法,因为它将根据表格实现。

之后,我编写了5个不同的转换器,每个转换器用于一个表,所有转换器都扩展为“Converter.java”

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

现在我的问题如下:

Q值。我不确定我是否正确使用了继承,或者上述方法是否应该有一些变化?

修改

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

3 个答案:

答案 0 :(得分:3)

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

要获得具体的策略,您可以将不同的查询传递给QueryValueSource的构造函数,或者将其子类化以创建特定于表的源。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

关于问题Q2:您可以做的是使Converter类抽象化,并为使用其中“query”属性的方法提供实现。使用Converter子类的构造函数来初始化查询属性。

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