gpt4 book ai didi

java - 应该如何使用抽象实例

转载 作者:行者123 更新时间:2023-11-29 10:18:20 24 4
gpt4 key购买 nike

我正在设计一款游戏,我对自己所做的事情有很好的了解。

然而,我一直在努力提高我的 OOP 技能,但时不时地遇到同样的问题,我应该如何使用抽象对象?

假设我有一个实体列表,它表示屏幕上具有 x 和 y 属性的任何东西,可能宽度和高度还没有全部计算出来!

然后我有特殊类型的实体,一种可以移动,一种不能移动,将来可能会发生碰撞。

它们都在实体集合中(在我的例子中是 List<Entity>),现在我想模拟移动的实体并且是主循环中 DynamicEntity 的实例,但它们都在实体的抽象列表中,我不'知道循环中的实体是否是动态实体。

我知道我可以用 instanceof 检查一下但我很确定这不是最好的主意..

我看到有些人在实体内部使用 boolean 值之类的东西来检查它的类型,但我真的不想在那里硬编码所有类型的实体..

我只想知道在这种情况下最好的做法是什么?

最佳答案

通常最好尽可能避免检查类型。如果您认为需要使用 instanceof在您的代码中,您可能会使用一个抽象来使您的设计更具可扩展性。 (如果您决定在将来添加第三种类型的 Entity,您不希望返回并使用第三种情况更新所有 instanceof 检查。)

有两种常见的方法可以根据实例的具体类型执行不同的操作而不检查具体类型:

一种常见的方式是 visitor pattern .这里的想法是为每种类型的对象创建一个具有操作的访问者类。接下来,每个具体类都有一个 accept简单调用正确 visit 的方法访问者类中的方法。这种单一级别的间接允许对象自己选择正确的操作,而不是您通过检查类型来选择它。

访问者模式通常用于以下两个原因之一。 1) 您可以将新操作添加到实现访问者模式的类层次结构中,而无需访问类的源代码。您只需要实现一个新的访问者类并将其与可访问类的预先存在的 accept 结合使用方法。 2)当一个人可以对来自某种类型层次结构的类执行许多可能的操作时,有时将每个操作拆分到它自己的访问者类中会更清楚,而不是用一堆不同操作的方法污染目标类,所以您将它们与访问者而不是目标类别分组。

然而,在大多数情况下,采用第二种方式更容易:简单地覆盖每个具体类中的公共(public)方法的定义。 Entity类可能有一个抽象 draw()方法,那么每种类型的实体都将实现 draw()方法不同。您知道每种类型的实体都有一个 draw()您可以调用的方法,但您不必知道它是哪种类型的实体的详细信息或该方法的实现是做什么的。您所要做的就是遍历您的 List<Entity>并调用draw()在每一个上,然后他们将根据他们的类型自己执行正确的操作,因为每种类型都有自己专门的 draw()实现。

关于java - 应该如何使用抽象实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12039989/

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