将多个对象相互传递

Posted

技术标签:

【中文标题】将多个对象相互传递【英文标题】:Passing Multiple objects To Each other 【发布时间】:2012-10-18 09:27:03 【问题描述】:

这是一个有点奇怪的问题,我有一个 GUI 类,它在构造函数中启动一个 Logic 类,负责处理App 那么它们是一个 Handler 类,其中包含一堆 ActionListners KeyListeners 附加到 GUI 类中的 UI 组件

LogicHandler 类的构造函数中,我将 GUI 类作为参数,以便能够操作 LogicHandler 类的 GUI 类中创建的 GUI 组件

我的问题是 Handler 使用 Logic 类,反之亦然(Logic 类使用 Handler 类),而我上面描述的方法实际上是不可能的,一个是实例在另一个之前,一个在尝试使用另一个时将为空。

例子:

public class GUI() 

    this.handler = new Handler(this);
    this.logic = new Logic(this);

如果handler 尝试使用logic 中的某些内容,则将返回null

解决此问题的一种方法是为handler 设置一个设置器以获取logic,反之亦然,但这似乎不是问题的答案。

【问题讨论】:

只需使用 setter 方法而不是构造函数来将这些引用相互传递。即logic.setHandler(handler)handler.setLogic(logic)。这真的不是什么大问题。 我将在 main 中创建逻辑,将逻辑传递给 GUI 构造函数,并让 GUI 实例化处理程序。我不认为 Logic 应该直接与 Handler 对话。 这些类彼此了解太多。跨不同类/用途的对象的循环引用是代码异味。我会重构,这样你就可以打破依赖循环。 也许你是对的,我看看能不能改正,谢谢! 【参考方案1】:

简单:

public class GUI() 

    this.handler = new Handler(this);
    this.logic = new Logic(this);
    handler.setLogic(logic);
    logic.setHandler(handler);

【讨论】:

是的,我想这是唯一的方法,我在想有一种更优雅的方法可以做到这一点,但它有效,谢谢! @Epicmaster:有什么不雅点? 不,我只是在想象有一些方法不涉及 setter,因为 setter 是可选的,而构造函数是强制性的,我不希望出现忘记使用 setter 的情况.但我想这是解决这个问题的唯一方法。【参考方案2】:

我认为可以只在 GUI 中公开 Handler 和 Logic,并让公众访问它。通过这样做,由于您的 Handler 和 Logic 已经引用了 GUI,它们可以间接地相互访问:

class Gui 
  private Handler handler;
  private Logic logic;

  public Handler getHandler() 
    return this.handler;
  
  public Logic getLogic() 
    return this.logic;
  


class Handler 
  private Gui gui;
  public Handler(Gui gui) 
    this.gui = gui;
  

  public void doSomething() 
    // access logic
    this.gui.getLogic().doSomeLogic();
  

关于“优雅”,我不认为(恕我直言)组件之间的混乱依赖的原始设计是优雅的:) 所以,与其专注于让这些东西看起来“优雅”,不如做一些重新思考,可能你会发现一切都会自动变得优雅得多。 :)

【讨论】:

我比我的回答更喜欢这个。 1+【参考方案3】:

在您第一次使用 handlerlogic 之前,您可以输入此代码 sn-p 如果(处理程序 == null) this.handler = new Handler(this); 如果(逻辑 == 空) this.logic = 新逻辑(this);

【讨论】:

如何解决最初的问题,即关于将hander 的引用传递给逻辑和将逻辑传递给handler 的问题? 防止GUI为空。 但这不是他的问题。他没有 GUI 为空的问题,因为以上所有内容都是从 GUI 类中调用的。他想将处理程序设置为逻辑,反之亦然,确保它们都不为空。你上面的代码没有给这个解决方案增加任何东西。 我同意@Hovercraft Full Of Eels 这并不能真正解决问题。我想将 Logic 和 Handler 对象相互传递,而在其他实例对象中没有一个为空。 GUI 不是问题。

以上是关于将多个对象相互传递的主要内容,如果未能解决你的问题,请参考以下文章

将多个 jQuery 对象作为数组传递

如何使用react将多个参数作为url中的对象传递

使用 jQuery 的 $.ajax() 将多个 Json 对象作为数据传递

如何将多个选项传递给 Firefox 中引导轮播的可选选项对象?

C ++将多个对象传递给线程中的函数

将触摸事件传递给多个选项之一