从超类对象数组调用子类方法
Calling a Subclass method from an array of Superclass Objects
我正在用 C++ 实现 Monopoly 游戏。我正在处理一个抽象超类 BoardSquare
(其唯一的 属性 是方块名称),根据游戏方块的类型(无论是 属性、机会等)有各种子类。 )
现在,由于我想将棋盘表示为数组,而方块的类型不同,我声明了一个 BoardSquare
指针数组:
GameSquare** board = new GameSquare*[40];
并继续根据类型填充每个条目:
board[1] = new Property("Old Kent Road", 0);
board[2] = new CommunityChest();
board[3] = new Property("Whitechapel Road", 0);
等等。
现在Property
,例如,有getPrice()
等具体方法。但是 运行
board[1]->getPrice()
给出错误
‘class GameSquare’ has no member named ‘getPrice’
这告诉我指针仍被视为 GameSquare。有没有解决的办法?也许是类型转换?还是一个更优雅的实现?
这是 object slicing 的一个很好的例子。
建议 1:动态向下转换
防止它的一种方法是添加以下内容:
Property *b1 = dynamic_cast<Property*>(board[index]);
if (b1)
{
int b = b1->getPrice(); // Or whatever getPrice() returns;
}
但是,您必须为每个子class(Property
、CommunityChest
等)尝试动态向下转换,这可能会使代码看起来笨拙你.
建议 2:将 getPrice() 添加到 GameSquare
正如一些评论者所建议的,您可以将方法 getPrice()
添加到 GameSquare
class。如果正方形不是 Property
,只是 return 0
。这允许您检查某物是 Property
还是其他东西。
您当然可以按照您的要求去做,但您必须这样做的事实意味着您违反了 OO 设计规则。
我建议根据玩家可以在其上执行的操作来查看每个方块,例如购买、抵押、拿卡、传球。当玩家降落在广场上时,一些动作可能是自动的。有些可能会在 GUI 中显示。
这样您就不必知道方块有价格 - 您只需向玩家提供可能的购买操作,并且该操作知道它是 属性。如果 属性 为玩家所有,它现在会获得 "build house" 操作。等等。
一个正方形将有一个类似于 vector<ActionPtr> getActionsFor(PlayerPtr player)
的方法。
我正在用 C++ 实现 Monopoly 游戏。我正在处理一个抽象超类 BoardSquare
(其唯一的 属性 是方块名称),根据游戏方块的类型(无论是 属性、机会等)有各种子类。 )
现在,由于我想将棋盘表示为数组,而方块的类型不同,我声明了一个 BoardSquare
指针数组:
GameSquare** board = new GameSquare*[40];
并继续根据类型填充每个条目:
board[1] = new Property("Old Kent Road", 0);
board[2] = new CommunityChest();
board[3] = new Property("Whitechapel Road", 0);
等等。
现在Property
,例如,有getPrice()
等具体方法。但是 运行
board[1]->getPrice()
给出错误
‘class GameSquare’ has no member named ‘getPrice’
这告诉我指针仍被视为 GameSquare。有没有解决的办法?也许是类型转换?还是一个更优雅的实现?
这是 object slicing 的一个很好的例子。
建议 1:动态向下转换
防止它的一种方法是添加以下内容:
Property *b1 = dynamic_cast<Property*>(board[index]);
if (b1)
{
int b = b1->getPrice(); // Or whatever getPrice() returns;
}
但是,您必须为每个子class(Property
、CommunityChest
等)尝试动态向下转换,这可能会使代码看起来笨拙你.
建议 2:将 getPrice() 添加到 GameSquare
正如一些评论者所建议的,您可以将方法 getPrice()
添加到 GameSquare
class。如果正方形不是 Property
,只是 return 0
。这允许您检查某物是 Property
还是其他东西。
您当然可以按照您的要求去做,但您必须这样做的事实意味着您违反了 OO 设计规则。
我建议根据玩家可以在其上执行的操作来查看每个方块,例如购买、抵押、拿卡、传球。当玩家降落在广场上时,一些动作可能是自动的。有些可能会在 GUI 中显示。
这样您就不必知道方块有价格 - 您只需向玩家提供可能的购买操作,并且该操作知道它是 属性。如果 属性 为玩家所有,它现在会获得 "build house" 操作。等等。
一个正方形将有一个类似于 vector<ActionPtr> getActionsFor(PlayerPtr player)
的方法。