gpt4 book ai didi

java - 在 Java 中访问高级类中的方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:43:21 25 4
gpt4 key购买 nike

上下文

我正在用 Java 制作 2D 游戏。

我有这个 Java 方案:

| Map | ---- | BlockGrid | ---- | Block |

其中 Map、BlockGrid 和 Block 是 Java 类。

在这里,Map 类 有一个BlockGrid 属性BlockGrid 类 有一个Block[ ][ ] 属性 存储网格中的所有 block 。

我的目标

我希望能够从我的 Block 类访问我的 Map 实例中的方法。例如,我想在 Map 实例上调用 spawnEntity(..) 来生成箭头或其他东西。

解决方案 ?

我考虑过制作 spawnEntity(..) static 但我知道这不是一个好的做法,因为为了生成一个实体,需要实例化 Map .

我还考虑过将我的 Map 实例作为参数传递给每个构造函数。这样,BlockGrid 和 Block 就可以访问实例并能够调用方法。

我的问题

这种情况下的最佳做法是什么?谢谢。

最佳答案

通常,一个好的做法是使用 loose coupling不相关的组件。这意味着,如果您选择通过传递引用使 Map 类的方法可用于 Block 类,您应该考虑通过接口(interface)来实现(请参阅 Omars 回答) .通过这种方式,您可以使用其他类的对象来初始化您的 Block,而不仅仅是 Map 实例(如果您以后选择这样做的话)。

但第二件事你应该问问自己,Block 是否真的有责任生成实体?我会说 no 因为 Block 可能只是一个位置加上一些结构的表示(尽管我不知道你的程序的语义)。通过选择不同的方式来构建您的程序,您可以避免引入 circular dependencies (Map 依赖于 BlockBlock 依赖于 Map)这通常被认为是一件非常糟糕的事情(除其他外)事情,因为你的组件高耦合)并遵循 Single responsibility principle (因为 Block 不再负责生成实体)。

在我看来,您不应该允许从 Block 访问 Map,而是让 Map 负责生成实体。一种方法是:

public final class Map {
private final BlockGrid blockGrid;

public Map(BlockGrid grid) {this.blockGrid = grid;}

public void spawnEntityAt(int x, int y) {
Block block = this.blockGrid.getBlockAt(x, y);
// spawn the entity using information from 'block'

}
}

final class BlockGrid {
private final Block[][] grid;

public BlockGrid(Block[][] grid) { this.grid = grid; }

public Block getBlockAt(int x, int y) {
return this.grid[x][y];
}
}

final class Block {}

关于java - 在 Java 中访问高级类中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58547241/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com