我正在扩展一个现有的库,它有一个抽象类(让我们称之为'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
更改了库的更改目的,并更新了类和方法名称以反映库。
答案 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思考,并会引导您走上痛苦的道路。
您应该考虑的是拥有一个生成实例并跟踪它们的工厂类。那家工厂可能想成为一个单身人士。您不希望库跟踪对象,您希望自己的结构生成您的特定对象集,并跟踪它们,但是您需要保留它们跟踪他们。