鉴于我有一个Game类:
@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 *'
答案 0 :(得分:1)
绝对!这就是Liskov substitution principle的意思。如果您从CutthroatGame
正确地继承了Game
,那么将Game
替换为其子类就没有问题。
答案 1 :(得分:0)
我认为你得到这个错误的原因是因为:
@property (strong) Game *game;
游戏类型为Game
而非CutthroatGame
。因此,当您尝试执行_game.opponent2 = [players objectAtIndex:0];
时,它会给您一个错误
你可以试试这个:
((CutthroatGame *)_game).opponent2 = [players objectAtIndex:0];