将类变量设置为抽象类

时间:2015-07-12 11:14:35

标签: java

我正在扩展一个现有的库,它有一个抽象类(让我们称之为'A'),使用抽象方法(让我们称之为'A.a()'),返回另一个类的实例('B')。 我试图了解哪些B'属于'(由哪些实例创建)A的实例。我在考虑这样做的方式是使用Aa返回的B实例( )作为A的类变量。问题是,在库中,A已经实现了五十多次,并且被调用的次数比这多出几倍。

关于库的一些进一步背景,类A和B是更大的递归模式的一部分,其中A的实例包含开发层次结构的子项(A的其他实例)。 首先开发A的层次结构,然后使用Aa()来开发B的层次结构(通过创建带有子节点的B的实例),但是不能“知道”关于另一个的任何东西,这是我想要改变的。

目前,我在A(' A.c()')中设计了一个新方法,可以在子类中a()的每个实现的return语句中调用它。 A.c()只接受返回的B实例,将变量设置为该实例,然后将该B实例返回给A.a()的return语句。

A和B在实际库中涉及的类和方法是:Atom(A),Box(B)和createBox(A.a())。 A.b和A.c()我已将其包含在我当前的解决方案中(参见上一段)。

public abstract class Atom {

    private Box b = null;

    public abstract Box createBox()

    protected Box setB(Box box){
        this.b = box;
        return box;
    }
}

public class Alpha extends Atom {

    ...

    public Box createBox(){
        ...
        Box box = new Box();
        ...
        return setB(box);
    }
}

我觉得这不是一个整洁的,也不是可管理的解决方案。理想情况下,我希望能够编写代码,无论A.a()返回什么,A中的变量都设置为此。有没有人知道实现这一目标的方法,或者可能建议我应该考虑采用更广泛的策略来解决不同层面的问题?

任何帮助,特别是指导重写问题或要求更多信息将不胜感激!我已经和这个人争斗了好几天了,我确定我错过了什么。

提前致谢!

编辑1

图书馆是sclateb的jlatexmath。 (http://forge.scilab.org/index.php/p/jlatexmath/downloads/

编辑2

更改了库的更改目的,并更新了类和方法名称以反映库。

2 个答案:

答案 0 :(得分:0)

更新:交换a()和c()

我建议将“跟踪”代码放入抽象类A中。这解决了已经有很多A-sub-class的问题。此外,我会使用泛型来将所需的所有代码放入A类。以下只是一个概述的草图:

public abstract class A<T extends B> {
  private T b = null;

  protected abstract T a();

  public final T c() {
    this.b = a();
    return this.b;
  }
}

public class Beta extends B {
  ...
}

public class Alpha extends A<Beta> {

  ...

  protected Beta a(){
    return new Beta()
  }
}

因此,您在公共方法中跟踪A和B之间的关系,并使用抽象保护方法创建Bs(即,您反转原始方法a()c()的功能)。这种设计直接实现了Alpha.c()。此外,使用泛型,它允许您将所有代码放入A并在A的不同子类中实例化不同的B.

答案 1 :(得分:0)

将类视为拥有实例非常不是Java思考,并会引导您走上痛苦的道路。

您应该考虑的是拥有一个生成实例并跟踪它们的工厂类。那家工厂可能想成为一个单身人士。您希望库跟踪对象,您希望自己的结构生成您的特定对象集,并跟踪它们,但是您需要保留它们跟踪他们。