【发布时间】:2015-08-05 18:00:24
【问题描述】:
我目前正在处理我最大的项目,但我无法弄清楚如何构建我的代码。我正在寻找一些指导。
我有 2 个对象:Tile 和 Container。每个 Tile 都有一个 2D 坐标,并且都是 Container 的子级。 Container 具有返回 tile 以获取位置、切换 tile、添加 tile 和删除 tile 的方法。
现在,当您单击某个图块时,它会消失,这很容易,因为它是自包含的。当我创建从基础 Tile 继承的不同类型的图块时,问题就出现了。当您单击它时,每种不同类型的磁贴都会执行不同的操作。一些破坏周围的瓷砖,一些与其他瓷砖切换,而另一些则添加新的瓷砖。为简单起见,我们将这 3 个子类称为 Tile-destroy、Tile-swap 和 Tile-add。
我的问题是,当我单击这些图块时,它们如何作用于 Container 中的其他图块。我应该只调用父类中的函数还是有更好的方法来做到这一点?我遇到了麻烦#include Tile 在 Container 以及其他方式。我觉得它不是一个合适的模式。
我已经设置好了,所以当点击发生时,Container 会处理它并检查点击的图块的类型,并使用一个大的 else-if 语句从那里开始操作,但这使它非常难以添加新的瓷砖类型。理想情况下,有关单击图块时发生的情况的所有信息都包含在每个图块子类中。
有什么想法吗?
【问题讨论】:
-
根据你的语言,你的容器可能有包保护的方法,只能被瓦片访问(它们位于同一个包中)。然后容器只会将事件委托给磁贴,磁贴将持有对其容器的引用,从而允许操作其他磁贴。您将有两种方法来移除磁贴。一种是简单地删除磁贴,另一种是将删除操作委托给磁贴。因此,如果一个图块破坏了它的所有邻居,并且被破坏的图块中的一个应该破坏它的正确邻居,这一切都会发生,
-
除非第一个被破坏的瓦片覆盖了兄弟瓦片的破坏。这对你有意义吗?
-
我正在使用 Objective-C。我正在尝试阅读更多关于委托包保护方法是不可能的。您是说破坏周围瓷砖的方法是在瓷砖中并将其传递给容器吗?对不起,我还是有点困惑。
-
是的,容器提供了细粒度的方法来销毁瓦片、添加瓦片等,但这些方法是直接从瓦片调用的。例如。点击时瓦片破坏兄弟瓦片...
user clicks on tile -> container.handleClick(tilePosition) -> tile.handleClick() -> container.destroySiblingsOf(this)它可能会有所不同,但这是双重调度的本质。 -
你还想控制被破坏的兄弟姐妹是否也应该踢他们的破坏逻辑。那可能是不同的方法,例如
destroySiblingOfWithoutPropagation vs destroySiblingsOf.
标签: oop design-patterns