这是一个代码设计问题。我正在制作一个基于平铺的游戏,其中一个类角色可以遍历某种类型的平铺,而另一个类则不能。在这种情况下,有战士类可以走过石砖。还有另一类,称为“挖掘者”(挖掘地下),不能穿过石砖(即不能钻入坚硬的岩石)。我的问题是,我如何设计类,以便类类型Warrior(从Entity类继承)的实体可以遍历石块,而类类型Burrower的实体(也从Entity类继承)不能遍历一块石头瓦?
Entity类具有纯虚函数canTraverse(Tile)。它将tile对象作为参数,并检查此实体是否可以遍历它。我的第一个想法是多态(http://www.cplusplus.com/doc/tutorial/polymorphism/)以及从同一个超类继承的两个不同的类如何根据类类型表现不同。不过,我的问题是,当函数canTraverse(Tile)不仅依赖于子类(Burrower或Warrior),而且它与tile类型的关系时,我怎样才能使Burrower类与Warrior的行为不同?
我有一个枚举: Enum TileType {GRASS,STONE} Tile类有一个成员变量tileType,其类型为enum TileType。 Tile的子类包括Stone和Grass,即Stone和Grass类都继承自Tile。 所以,在Burrower类的canTraverse函数中,我会有类似的东西:
Boolean Warrior::canTraverse(Tile tile)
{
// a warrior can traverse any kind of tile
Return True;
}
Boolean Burrower::canTraverse(Tile tile)
{
If(tile.getType() == STONE)
{
Return False;
}
Return True;
}
这应该可行,但如果我调用instanceof:
,它看起来很危险If ( tile instanceof STONE)
Return False;
哪种情况与多态性有关(http://www.artima.com/interfacedesign/PreferPoly.html)。有没有更好的方法/更好的编码实践我可以遵循让Burrower类弄清楚它不能遍历STONE类型的tile?
答案 0 :(得分:0)
根据我的理解,您希望能够说出角色是否可以遍历瓷砖。我将这个功能提取到一个单独的类(比如MapTraversal),它将采用两个参数,一个字符和一个tile,并决定是否可以进行遍历。
此课程可以依赖于细节,例如平铺类型,字符类型或其他属性,如字符强度或时间。
通过这种方式,您可以分离字符和tile类。
关于你的问题,在你的情况下,你必须依赖属于类的特定属性(属性),如果你有一个来自tile的石子类你可以引入一个接口istraversablefor(character),但你仍然是必须检查那里的字符类型。因此,我上面的例子,将这个逻辑解耦为一个实际上可能需要这些信息的类。
您也可以选择不同的路线。您想要基于两种不同的对象调用方法。在这种情况下,您可能希望使用可以通过访问者模式实现的双重调度。双重调度将使您正在编写的编程语言(如C ++)根据相关对象的类型选择要执行的正确函数。