代码之家  ›  专栏  ›  技术社区  ›  Amit

Java中继承问题

  •  2
  • Amit  · 技术社区  · 15 年前

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

    树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”的值。

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

    因此,对于5个不同的表应该有5个不同的查询。因此,我没有编码5个不同的转换器,而是制作了一个具有类似功能的单曲“转换器.java”。

    • opestEnter()
    • 关闭()
    • OpenBRACHECH()
    • 闭锁()
    • 开叶()
    • 关闭()
    • AdDATA引文()

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

    之后,我编码了5个不同的转换器,每个转换器都是一个表,它们都扩展了“转换器.java”。

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

    现在我的问题是:

    问:我不确定我是否正确地使用了继承,或者在上面的方法中应该有一些改变?

    编辑:

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

    3 回复  |  直到 15 年前
        1
  •  3
  •   axtavt    15 年前

    我认为战略模式在这里更合适。你可以创建一个非抽象的 Converter 用公共行为初始化,并为其提供 ValueSource ,可以执行表特定的值检索。然后创建一个 QueryValueSource (子类) 价值源泉 )根据指定的查询检索值。

    要获得具体的策略,可以将不同的查询传递到 查询值源 或将其子类化以创建表特定的源。

        2
  •  1
  •   spurserh    15 年前

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

        3
  •  0
  •   sateesh    15 年前

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

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