2015-07-12 121 views
-4

设置类变量作为方法的输出(姑且称之为“A”)与一个抽象方法(我们称之为“AA()” )返回另一个类的实例('B')。 我试图对其中B的情况下,“属于”(通过创建),这A.我在想这样做的方法的实例是使用B的由AA()返回的实例作为类变量信息对于答案。问题是,在图书馆里,A已经执行了五十次以上,被称为比这更多次。在我上有一个抽象类的现有库扩展一个抽象类

在库中的一些进一步的背景中,类A和B是其中A的一个实例包含显影层次结构的儿童(A的其他实例)大的递归模式的一部分。 A的层级首次开发则A.A()被用于开发B的层次结构(通过创建B的情况下,也有孩子),但是既不是“知道”有关的任何其他这是什么,我试图改变。

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

的类和A和B涉及在实际文库的方法有:原子(A),盒(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中的变量都设置为此。有没有人知道实现这一目标的方式,或者可能提出一个更广泛的战略,我应该着眼于在不同的层面上解决这个问题?

任何帮助,特别是指导重新措辞的问题或了解更多信息的请求,将不胜感激!我一直在争取这一天几天,现在肯定我错过了一些东西。

在此先感谢!

EDIT 1个

该文库是通过SCILAB jlatexmath。 (http://forge.scilab.org/index.php/p/jlatexmath/downloads/

编辑2

底气变化到库的目的和更新类和方法名,以反映该库。

+2

您可能想提及库和/或提供其他上下文或示例代码。事实上,这几乎是不可理解的抽象,类和实例之间的关系很难遵循。 – pvg

+0

@pvg我已经添加了库名,也会在一会儿抓一个URL。我正在努力思考我可以添加哪些代码示例,因为我在那里的代码示例实际上是在库中发生的。你有什么建议吗? – lachy

+0

你写的具体的类和方法是什么?你试图完成什么样的总体目标? – pvg

回答

0

将类视为拥有实例的想法并不是Java思维,并且会导致您陷入痛苦的路径中。

你应该考虑的是拥有一个生产实例并跟踪它们的工厂类。该工厂可能想成为一个单身人士。你做不是想要一个库来跟踪对象,你想要你自己的结构产生特定的一组对象并跟踪它们,但是你需要跟踪它们。

+0

谢谢!我认为这就是我正在寻找的,在解决这个问题时我应该使用的结构。为我的言辞滔滔不绝的问题欢呼! – lachy

0

更新:交换()和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() 
    } 
} 

所以你跟踪公共方法A和B之间的关系并使用抽象受保护的方法来创建Bs(即,您颠倒了原始方法的功能a()c())。这个设计使得Alpha.c()的实施变得直截了当。此外,使用泛型,它允许您将所有代码放入A并在B的不同子类中实例化不同B.

+0

感谢您的回答!我不确定这是否会起作用,因为在库中调用的唯一方法是c(),所以我没有看到A.a()会如何被调用? – lachy

+0

我以为a()会被图书馆调用。只需交换一个()和c()比。 –

+0

谢谢,但这仍然让我处于不得不编辑和维护每一个子类的相同位置,所以我不认为这是我正在寻找的解决方案。 – lachy