2

鉴于我有一个游戏课:

@interface Game : NSObject

带有 CutthroatGame 子类:

@interface CutthroatGame : Game

如果我的 ViewController .h 文件中有这样的属性:

@property (strong) Game *game;

我可以在我的 ViewController .m 文件中安全地覆盖这样的属性吗:

if (_playerCount == 3) {
    _game = [[CutthroatGame alloc] init];
else {
    _game = [[Game alloc] init];   
}

编辑:如果这应该工作,我该如何处理以下错误?

CutthroatGame 定义了许多附加属性,例如:

@property (strong) Player *opponent2

当我尝试使用 ViewController 的 _game 属性访问它们时,我收到以下错误:

 _game.opponent2 = [players objectAtIndex:0]; -- ERROR: Property 'opponent2' was not found on object of type 'Game *'
4

2 回答 2

1

绝对地!这就是里氏替换原则的意义所在。如果您正确地CutthroatGame从子类化Game,则用它的子类替换将没有问题Game

于 2013-06-28T00:28:38.080 回答
0

我认为您收到该错误的原因是:
@property (strong) Game *game;
游戏类型Game不是CutthroatGame. 因此,当您尝试这样做时,_game.opponent2 = [players objectAtIndex:0];它会给您一个错误。
你可以试试这个:
((CutthroatGame *)_game).opponent2 = [players objectAtIndex:0];

于 2013-06-28T00:58:24.143 回答