Java 将类变量设置为抽象类中方法的输出

Java 将类变量设置为抽象类中方法的输出,java,Java,我正在扩展一个现有的库,它有一个抽象类,我们用一个抽象方法称它为“A”,它返回另一个类“B”的实例。我试图获得关于B“所属”的哪些实例是由A的哪些实例创建的信息。我考虑这样做的方式是使用A.A返回的B实例作为A的类变量。问题是,在库中,A已经实现了50多次,并且被调用的次数比这个多得多 在库的进一步背景知识中,类A和B是更大的递归模式的一部分,其中A的实例包含开发层次结构的A的子实例和其他实例。首先开发A的层次结构,然后使用A.A来开发B的层次结构,方法是创建B的实例,同时创建子对象,但是两个对

我正在扩展一个现有的库,它有一个抽象类,我们用一个抽象方法称它为“A”,它返回另一个类“B”的实例。我试图获得关于B“所属”的哪些实例是由A的哪些实例创建的信息。我考虑这样做的方式是使用A.A返回的B实例作为A的类变量。问题是,在库中,A已经实现了50多次,并且被调用的次数比这个多得多

在库的进一步背景知识中,类A和B是更大的递归模式的一部分,其中A的实例包含开发层次结构的A的子实例和其他实例。首先开发A的层次结构,然后使用A.A来开发B的层次结构,方法是创建B的实例,同时创建子对象,但是两个对象都不“知道”其他对象的任何信息,这正是我试图改变的

目前,我在a.c.中设计了一个新方法,可以在子类中a的每个实现的返回语句中调用该方法。A.c只需获取正在返回的B的实例,将变量设置为该实例,然后将B的实例返回到A.A的return语句

实际库中与A和B相关的类和方法是:Atom A、Box B和createBox 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

该库由scilab提供

编辑2

增强了对库进行更改的目的,并更新了类和方法名称以反映库。

更新:exchange a和c

我建议将跟踪代码放在抽象类A中。这解决了已有许多A子类的问题。此外,我将使用泛型将您需要的所有代码放入类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()
  }
}

因此,您可以在public方法中跟踪A和B之间的关系,并使用抽象保护的方法来创建B,即,您可以反转原始方法A和c的功能。这种设计使Alpha.c的实现变得简单明了。此外,使用泛型,它允许您将所有代码放入A中,并在A的不同子类中实例化不同的B。

将类视为拥有实例的想法在很大程度上不是Java思维,这会让您陷入痛苦的道路


您应该考虑的是使用一个工厂类来生成实例并跟踪它们。那家工厂可能想成为单身汉。您不希望库跟踪对象,您希望自己的结构能够生成特定的对象集并跟踪它们,但是您需要跟踪它们。

您可能希望提及库和/或提供一些其他上下文或示例代码。事实上,这几乎是难以理解的抽象,类和实例之间的关系很难理解。@pvg我已经添加了库名,过一会儿也会获取一个URL。我正在努力思考我可以添加什么样的代码示例,因为我所拥有的就是库中发生的事情。你有什么建议吗?你写的具体的课程和方法是什么?你想要达到的总体目标是什么?我能做到:我也说过几次我想做的事情,但它们可能会在文字中消失,所以我也会加粗。谢谢你的回答!我不确定这是否会起作用,因为在库中调用的唯一方法是c,所以我根本不知道A.A将如何被调用?我以为库将调用A。只需交换a和c即可。谢谢,但这仍然让我不得不编辑和维护每个子类,所以我认为这不是我正在寻找的解决方案。我想这是没有办法的。如果要在A的不同子类中实例化B的不同子类,则需要调整所有新的B语句。同样的道理,如果你使用一个工厂模式,正如bmarglies所建议的那样。听到这个消息很失望,但没关系。谢谢你的帮助,非常感谢:谢谢你!我想这就是我一直在寻找的,我应该在接近时使用的结构 这是个问题。也为我的措辞糟糕的问题干杯!