访问超类的实例变量,适当的形式

问题描述:

我对objective-c和编程非常陌生。我已经读过一个关于objective-c的*上发布的问题之一,它是“不良形式”,直接到访问超类的实例变量。下面是什么,我认为这意味着直接从超类(例1)访问一个实例变量的例子,我想这可能意味着使用正确的形式(例2):访问超类的实例变量,适当的形式

// ExampleSuperClassMonster.h 
@interface ExampleSuperClassMonster : CCSprite { 
    int hp; // hitpoints 
} 
@property (readwrite) int hp; 
@end 

// ExampleSubClassMonster.h 
@interface ExampleSubClassMonster : ExampleSuperClassMonster { 
@end 

// Example 1: is this bad form?? 
ExampleSubClassMonster *subClassMonster = [[ExampleSubClassMonster alloc] init]; 
subClassMonster.hp = 100; 

// Example 2: is this correct form?? 
ExampleSubClassMonster *dummyMonster = [[super alloc] init]; 
dummyMonster.hp = 100; 
ExampleSubClassMonster *subClassMonster = [[ExampleSubClassMonster alloc] init]; 
subClassMonster.hp = dummyMonster.hp; 
[dummyMonster release]; 

道歉,如果这个问题是无关紧要的,或者我没有道理。另外,如果我错误地理解了访问超类的实例变量时可能存在的错误形式,这表示歉意。此外,如果这个问题已经被问到(我找不到任何类似的问题) - 如果有的话,道歉,这个问题的链接将是有益的。谢谢。

+0

我看不出任何使用示例2的原因。例如1好, – 2012-03-04 10:45:20

+0

谢谢。有什么样的例子,它可能被认为是一种超类的实例变量被访问的不良形式? – markckim 2012-03-04 10:56:46

+0

如果从子类访问ivar不好,应该用'@ private'保护,而不能从子类访问 – 2012-03-04 11:20:43

例1很好。
[super init]应该从子类的init方法中调用。

- (id) init { 
    self = [super init]; 
    if (self) { 
     // Init 
    } 
    return self; 
}