2

我正在尝试使用据我所知的最佳实践来创建游戏。我有:

  • 一个VisibleObjectprotected void draw(Canvas c)功能的
  • 一个MapTile用来extends VisibleObject画自己的。
  • 一个Map包含 MapTiles 的 LinkedList 的类,tiles.

Map课堂上,我想要一个这样的循环:

public void draw(Canvas c){
        for(MapTile tile : tiles){
            tile.draw(c);
        }
    }

但我意识到我不能在每个图块上调用 draw,因为它是VisibleObject. 我可以想到 3 种可能的解决方案:

  1. 只需更改protectedpublicin VisibleObject
  2. 创建一个只调用的 MapTile 的公共方法super.draw(c)(我认为这是有效的语法?)
  3. 将 Map 中的 for 循环更改为类似的内容,我相信这会使其有效。

新循环:

MapTile current;
for(MapTile tile : tiles){
    current = tile;
    current.draw(c);
}

哪种解决方案会是更好的编程实践?

4

4 回答 4

3

我会选择版本 2。版本 1 会在父级中引入可能不应该存在的访问修饰符(例如从protectedto public),而版本 3 没有多大意义,因为您仍在使用MapTile(即使它确实,它看起来很尴尬和不自然)。

如果类的任何子级需要公开父级的受保护方法,最好的办法是创建一个调用父级方法的公共方法。

于 2012-09-01T14:02:31.097 回答
2

还有另一种选择:MapMapTileVisibleObject在同一个包中。而且它们似乎非常相关:MapTile是 a 的一部分Map并且MapTile是 a VisibleObject。这样你就可以MapTile.drawMap类中看到方法。我不会让这个draw方法在这个包之外可见。

于 2012-09-01T14:06:34.400 回答
1

如果方法需要被外部对象调用,那么它必须是公共的。我没有办法解决这个问题。另一方面,如果该方法只会被类内部的其他方法调用,则将其保留为受保护或私有。

我看这个类似于SwingJComponent#paint(...)JComponent#paintComponent(...)方法。前者由 Swing 绘制管理器直接调用,因此必须是公共的,而后者仅由paint(...)方法内部调用,因此受到保护。

于 2012-09-01T14:01:13.670 回答
1

在我看来, draw() 应该是公开的。draw() 方法似乎与任何想要创建或持有 MapTile 对象的对象都非常相关。

然而,禁止其他人访问地图中的特定 MapTiles 是另一回事。这里的负担落在 Map 类上。MapTiles 的 LinkedList 应该是私有的。如果其他对象需要它,public LinkedList<MapTiles> getMapTiles()可以提供一些 getter 方法 ( ) 来访问(一个副本?)列表。如果您真的担心其他对象如何访问 MapTiles,则 Map 和 MapTiles 应该在同一个包中,以便这些对象可以交换信息,而其他包中的其他类只能访问某些公共 getter 方法。

于 2012-09-01T14:06:45.630 回答