2013-03-16 52 views
2
@interface rectangle: NSObject 
@property int width, height; 
{ 
    -(int) area; 
    -(int) perimeter; 
    -(void) setWidth: (int) w andHeight: (int) h; 
} 
@end 

@implementation rectangle 
@synthesize width, height; 
... 
... 
@end 

我做了長方形的正方形子爲什麼我不能直接使用實例變量從父類

@interface square: rectangle 
-(void) setSide: (int) s; 
-(int) side; 
@end 


@implementation square 
-(void) setSide: (int) s 
{ 
    [self setWidth: s andHeight: s]; 
} 
-(int) side 
{ 
    return self.width; 
} 

@end 

我的主要問題是:爲什麼我不能只是這樣做

return width; 

當我想獲得我的方形物體的一面。 我想

@property int width, height; 

距離

@interface rectangle: NSObject 
{ 
    int width; 
    int height; 
} 
//getter/setter methods 
... 
@end 

,並在書中簡化,如果一個實例變量在@interface聲明,它是由它的子類繼承。但是,顯然,

return width; 

似乎並不奏效。這是爲什麼發生?

+3

屬性當然不是實例變量的「簡化形式」。 – sosborn 2013-03-16 08:37:09

+0

是在屬性中聲明的變量是一個私有變量? – 2013-03-16 08:40:56

+0

一個屬性不止於此。屬性使setter和getter可訪問,並定義訪問器的一些關鍵行爲(例如,複製與分配結果稍有不同的setter)。並且該屬性可以從外部訪問。當你使用@synthesize時,相應的iVar應該是「寬度」,就像你使用它的方式一樣。如果你只聲明屬性,你應該讓它自動合成它,那麼相應的受保護的ivar的名字就是'_width。 – 2013-03-16 08:45:00

回答

3

問題是,綜合屬性是實現的一部分,而不是接口。子類只能依靠接口。

例如,@synthesize可以有指定不同的實例變量的名稱(例如@synthesize width = _my_funky_width;)和子類具有不知道什麼是真正的實例變量是的方式。

相關問題