如果 class 函数定义取决于 subclass 以及 subclass 与另一个 class 类型的关系,如何实现多态性
How to implement polymorphism if the class function definition depends on the subclass AND the subclass's relationship with another class type
这是一道代码设计题。我正在制作一个基于图块的游戏,其中一个 class 角色可以遍历某种类型的图块,而另一个 class 不能。在这种情况下,有一个战士 class 可以跨过石块。还有另一种 class,叫做“挖洞者”(在地下挖掘),它不能穿过石块(即不能挖入坚硬的岩石)。我的问题是,我如何设计 classes 以便 class 类型的实体 Warrior(从实体 class 继承)可以遍历石块,而 class 类型 Burrower (也继承自 Entity class) 不能穿越石块?
实体 class 具有纯虚函数 canTraverse(Tile)。它以一个 tile 对象作为参数,并检查该实体是否可以遍历它。我的第一个想法是多态性 (http://www.cplusplus.com/doc/tutorial/polymorphism/) 以及从同一个超级 class 继承的两个不同的 classes 如何根据 class 类型表现不同。不过,我这里的问题是,当函数 canTraverse(Tile) 不仅取决于 subclass(Burrower 或 Warrior),还取决于它们之间的关系时,我如何才能使 class Burrower 的行为与 Warrior 不同瓷砖的类型?
我有一个枚举:
枚举 TileType {GRASS, STONE}
Tile class 有一个成员变量tileType,它是enum TileType 类型。 Tile 的 Subclass 包括 Stone 和 Grass,即 Stone 和 Grass class 都继承自 Tile。
所以,在 Burrower class 的 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)。有没有更好的 way/better 编码实践我可以遵循让 Burrower class 弄清楚它不能遍历 STONE 类型的图块?
据我了解,您希望能够说明角色是否可以遍历一个图块。我将此功能提取到一个单独的 class(比如 MapTraversal),它将采用两个参数,一个字符和一个图块,并决定是否可以遍历。
这个class可以依赖于细节,例如图块类型、字符类型或其他属性,如字符强度或一天中的时间。
通过这种方式,您可以解耦字符和图块 classes。
关于你的问题,在你的情况下,你必须依赖 class 的一部分的细节(属性),如果你有一个 stone subclass from tile 你可以引入一个interface istraversablefor(character),但你仍然必须检查那里的字符类型。因此我上面的例子,将这个逻辑解耦到一个 class 可能实际上需要这个信息。
你也可以走不同的路线。你想调用一个基于两种不同类型对象的方法。在这种情况下,您可能希望使用可以由访问者模式实现的双重分派。双重分派将使您正在编写的编程语言(例如 C++)根据相关对象的类型选择正确的函数来执行。
这是一道代码设计题。我正在制作一个基于图块的游戏,其中一个 class 角色可以遍历某种类型的图块,而另一个 class 不能。在这种情况下,有一个战士 class 可以跨过石块。还有另一种 class,叫做“挖洞者”(在地下挖掘),它不能穿过石块(即不能挖入坚硬的岩石)。我的问题是,我如何设计 classes 以便 class 类型的实体 Warrior(从实体 class 继承)可以遍历石块,而 class 类型 Burrower (也继承自 Entity class) 不能穿越石块?
实体 class 具有纯虚函数 canTraverse(Tile)。它以一个 tile 对象作为参数,并检查该实体是否可以遍历它。我的第一个想法是多态性 (http://www.cplusplus.com/doc/tutorial/polymorphism/) 以及从同一个超级 class 继承的两个不同的 classes 如何根据 class 类型表现不同。不过,我这里的问题是,当函数 canTraverse(Tile) 不仅取决于 subclass(Burrower 或 Warrior),还取决于它们之间的关系时,我如何才能使 class Burrower 的行为与 Warrior 不同瓷砖的类型?
我有一个枚举: 枚举 TileType {GRASS, STONE} Tile class 有一个成员变量tileType,它是enum TileType 类型。 Tile 的 Subclass 包括 Stone 和 Grass,即 Stone 和 Grass class 都继承自 Tile。 所以,在 Burrower class 的 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)。有没有更好的 way/better 编码实践我可以遵循让 Burrower class 弄清楚它不能遍历 STONE 类型的图块?
据我了解,您希望能够说明角色是否可以遍历一个图块。我将此功能提取到一个单独的 class(比如 MapTraversal),它将采用两个参数,一个字符和一个图块,并决定是否可以遍历。
这个class可以依赖于细节,例如图块类型、字符类型或其他属性,如字符强度或一天中的时间。
通过这种方式,您可以解耦字符和图块 classes。
关于你的问题,在你的情况下,你必须依赖 class 的一部分的细节(属性),如果你有一个 stone subclass from tile 你可以引入一个interface istraversablefor(character),但你仍然必须检查那里的字符类型。因此我上面的例子,将这个逻辑解耦到一个 class 可能实际上需要这个信息。
你也可以走不同的路线。你想调用一个基于两种不同类型对象的方法。在这种情况下,您可能希望使用可以由访问者模式实现的双重分派。双重分派将使您正在编写的编程语言(例如 C++)根据相关对象的类型选择正确的函数来执行。