【问题标题】:intercommunication among classes in javajava中类之间的相互通信
【发布时间】:2015-04-14 20:59:32
【问题描述】:

请原谅我糟糕的术语!

我一直在为一个问题苦苦挣扎。

我正在用 java 制作一个游戏引擎,但我经常遇到同样的问题。我有这个类层次结构:

父母 -> 孩子 -> 孙子

PARENT 拥有和构造 CHILD 等等。

现在,父级可以执行 CHILD 和 GRANDCHILD 在执行期间需要执行的操作。假设 GRANDCHILD 是 GUI 中的一个按钮,而 PARENT 是游戏的核心。如果按下按钮,我想暂停游戏。 button/GRANDCHILD 本身没有办法做到这一点,但需要通过 PARENT/CORE 做到这一点。

父母 --> 孩子 --> 孙子 +暂停游戏()+做某事()

这个问题我有三个解决方案,没有一个让我满意。

  1. 返回值。 PARENT/GAME-CORE感觉鼠标被按下了,叫CHILD,它叫GRANDCHILD。 GRANDCHILD 承认它已被按下并将一个 int 或枚举返回给 PARENT/CORE。 PARENT/CORE 使用 case/if-else 来确定需要做什么。

PARENT int:click()--> CHILD int:click() --> GRANCHILD int:click()

父母的功能

switch(CHILD.click(){
case 1 do this;
case 2: do that;
etc.
}

这是我最讨厌的解决方案。我不仅需要跟踪整数/枚举,而且当我可以使用多态来获得更清晰的代码时,我还需要使用 switch/if-else。

  1. 我认为这种方法称为回调。在构造时,PARENT 会发送一个内部类/一组函数,这些函数会传递给 GRANDCHILD 的构造函数。 GRANDCHILD 保存这个内部类实例并在需要时调用它的方法。

    类家长{

    儿童;

    父母(){ 孩子=新孩子(新控制器); }

    类控制器{

    公共无效点击(){ 做东西... }

    }

    }

这没问题,但感觉不对。 gamecore 可能有数百个 CHILDREN,这意味着数百个内部类,这些函数可能或多或少地做同样的事情。随着游戏的发展,课程将变得庞大。这也会在层次结构中产生循环,我有一种不好的感觉。

  1. 我认为这称为“服务”。 PARENT/GAMECORE 是公开的。任何类都可以调用它的方法。好吧,在这种情况下:PARENT->CHILD->GRANDCHILD,PARENT 和 CHILD 都需要公开,因为 GRANDCHILD 需要 CHILD 的方法和 PARENTS。这感觉不太好。

如果只有少数几个需要可访问的类,我可以忍受这一点。问题是我几乎一直需要所有人的相互交流!

那我该怎么办?我是否遗漏了什么?如果没有,以上哪项是最佳做法,并且可以让我免于未来的头痛?

【问题讨论】:

    标签: java game-engine


    【解决方案1】:

    这主要取决于您的编码风格。 如果您查看一些游戏库,通常可以使用单例或其他模式从代码中的任何位置调用主要核心对象(您的核心、输入等)。

    如果您使用 Java 1.8,您可以使用回调功能而无需编写大量内部类。

    //in your child/grandchild
    public void doStuff(Runnable callback){
        //do stuff
        callback.run();
    }
    

    您可以将method references 传递给这些方法

    //somewhere else
    child.doStuff(core::myCallbackFunction);
    

    您可以使用函数式接口以这种方式传递许多不同的消费者/供应商/函数,因此您也可以编写带有参数和返回值的回调。

    但是,大多数情况下,这取决于您认为最适合您的编码风格。

    【讨论】:

    • 那么我错过了什么伟大的技术可以让我从痛苦中解脱出来?
    • 据我所知没有。另一种可能的方式是通过方法传递某种核心对象,该核心对象包含其他核心对象的public 子对象。所以你会摆脱单身人士。 public void update(Core c){c.Input.getInput();...}
    【解决方案2】:

    关于您的帖子有一点令人困惑的是,这里的“父母”和“孩子”实际上并不是面向对象意义上的父母和孩子,而仅仅是交互的对象。因此,任何特定功能都应仅由相关类处理 - 无需涉及其他对象来回传递消息。

    对于按钮等 GUI 元素,请考虑使用侦听器。让核心实现一个合适的 Listener 接口并将其添加到每个元素 - 这是 Observer 设计模式,有点类似于回调方法。

    【讨论】:

    • 确实,在我的示例中,父 -> 孩子 -> 孙子仍然是视图,但在我没有提到的其他方面,它们在这个意义上是相关的。但是,问题在于 PARENT、CHILD、GRANDCHILD 都需要访问“模型”,而模型又需要访问视图(gui)。我自己也很困惑,但感谢您的提示!
    猜你喜欢
    • 1970-01-01
    • 2014-05-24
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    相关资源
    最近更新 更多