我可以使用.m文件中的类的子类覆盖属性的类吗?

时间:2013-06-28 00:26:26

标签: iphone ios objective-c

鉴于我有一个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 *'

2 个答案:

答案 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];