繁体   English   中英

如何在处理/ Java Eclipse项目中没有构造函数的情况下访问其他类中的主类对象?

[英]how to access main class objects in other classes without a constructor in a processing/java eclipse project?

我似乎无法在任何地方的互联网上找到答案。

所以我在Eclipse中有一个处理项目

我希望能够访问在另一个类中扩展PApplet的“主”类中的对象,而不必通过构造函数传递它们。 我不是最有经验的程序员,因此我的术语可能不正确,但是希望该示例可以阐明我的工作意图。

因此对于


public class Main Extends PApplet{

    //Example Class to access objects from main
    Interaction interaction;   

    //Example Objects I want
    boolean someObject;

    void setup(){        
        someObject = true;
        Interaction = new Interaction();  
    }

    void draw(){
    }   
}

public class Interaction{

    PApplet p;

    public Interaction(PApplet parent){
        p = parent;
    }

    public void mousePressed(){
        if(someObject){
            //do something
        }   
    }
}  

所以我知道我可以将该对象传递给Interaction的构造函数,例如

PApplet p;
boolean o;

public Interaction (PApplet parent, boolean SomeObject){
    p = parent;
    o = someObject;
}

但这在这样的示例中有点疯狂,我只是想将所有的鼠标和键盘交互保持在自己的类中,因为它的规模越来越大,但是我一次又一次地遇到了这种需求,而且似乎无法想办法。

您所描述的称为getter方法。

您可以在Main添加一个getter方法,但首先请阅读-> http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html

这是例子。

public class Main Extends PApplet {

    ...

    public boolean getSomeObject ( )
    {
        return someObject;
    }
}

public class Interaction {

   PApplet p;

   public Interaction(PApplet parent){
      p = parent;
   }

   public void mousePressed() {

       if( p.getSomeObject( ) ) {
           //do something
       }

   }
}

顺便说一句, boolean不是Java中的ObjectBoolean是。

编辑在您发表评论后,我确实了解您的需求。

您需要创建一个interface并将此接口传递给Interaction构造函数。

该界面应提供Interaction所需的所有方法。 如果需要访问PApplet ,则这是您的界面应提供的。

考虑到这一点,这是一个新的层次结构:

public interface IInteractionContext
{
  boolean getSomeObject( );
}

public class Main
  extends PApplet
  implements IInteractionContext
{
  @Override
  public boolean getSomeObject ( )
  {
    return someObject;
  }

  ...
}

public class Main Extends PApplet {

    ...

    public boolean getSomeObject ( )
    {
        return someObject;
    }
}

public class Interaction {

   final IInteractionContext ctx;

   public Interaction(IInteractionContext ctx)
   {
      this.ctx = ctx;
   }

   public void mousePressed() {

       if( ctx.getSomeObject( ) )
       {
           //do something
       }

   }
}

通过这些更改,如果ctxMainPAppletUnicorn ,则Interaction可能会不太PApplet 它的构造函数请求预期的行为,而Main的实现在运行时提供了此行为。

无论如何,请阅读javaworld文章和相关文章。 另外,请阅读有关Dependency Injection文章

小程序基本上是应用程序的顶级容器,它为用户交互GUI /显示和输入(鼠标单击,键盘)提供了上下文。

在设计良好的应用程序中,您的业务逻辑应封装在一个或多个类中,并且您将基于外部输入在此方法上进行调用,然后可能会查询它的信息以输出到GUI。 这非常笼统。

顶级容器(在本例中为Applet)只应与实例化业务对象,捕获用户输入,在业务对象上调用方法,然后根据业务对象的状态更新GUI有关。

我猜想您会被迫将所有交互代码包装到一个类中,以使业务逻辑清晰明了。 在这种情况下,应该封装业务逻辑,而不是通过Applet类进行传播。 这将使您可以轻松地将业务对象转移到桌面应用程序,甚至完全不使用GUI即可运行它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM