如何使用抽象实例

Ruu*_*kis 1 java oop abstraction

我正在设计一款游戏,我对自己的工作有很好的了解.

然而,我一直在努力提高我的OOP技能但是我现在面对同样的问题,我应该如何使用抽象的对象?

让我说我有一个实体列表,代表屏幕上有x和y属性的任何东西,可能宽度和高度还没有完全搞清楚!

然后我有特殊类型的实体,一个可以移动,一个不能,也可能是将来可以碰撞的东西.

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

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

我已经看到有些人在实体中有类似布尔值的东西来检查它的类型,但我真的不想硬编码所有类型的实体.

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

Dao*_*Wen 5

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

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

一种常见的方式是访客模式.这里的想法是创建一个Visitor类,其中包含每种类型对象的操作.接下来,每个具体类都有一个accept方法,它只是visit在访问者类中调用正确的方法.这种单向间接允许对象自己选择正确的操作,而不是通过检查类型来选择它.

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

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