Доступ к закрытой переменной экземпляра родительского класса - PullRequest
0 голосов
/ 24 января 2012

Я не могу понять, почему класс B может обращаться к частной переменной экземпляра класса A. Вот мой код

хиджры

#import <Foundation/Foundation.h>

@interface A : NSObject 
{

@private
    int x;
}

@property int x;

-(void)printX;
@end

a.m

#import "A.h"

@implementation A
@synthesize x;

-(void)printX
{
    NSLog(@"%i", x);
}

@end

B.h

 #import "A.h"

    @interface B : A 
    {

    }

    @end

main.m

    B *tr = [[B alloc] init];
    tr.x = 10; 
    [tr printX];

Здесь я могу получить доступ к переменной экземпляра класса x, несмотря на то, что она объявлена ​​как private?

Ответы [ 2 ]

1 голос
/ 24 января 2012

Вы не получаете доступ к закрытой переменной там, по крайней мере, не напрямую: вы получаете доступ к общедоступному свойству, которое имеет законный доступ к закрытому ivar.

Ваш код эквивалентен этому:

B *tr = [[B alloc] init];
[tr setX:10]; 
[tr printX];

Оператор @synthesize создал методы получения и установки для вас.Если вы хотите, чтобы был доступен только получатель, отметьте вашу собственность readonly и делайте все записи через ивар в классе A.

0 голосов
/ 24 января 2012

В вашем файле реализации сделайте это наверху.

@interface A : NSObject 
{

@private
    int x;
}
@property int x;
@end

таким образом, x будет закрытым, поскольку он находится в файле реализации. не раздел интерфейса ... все классы импортируют раздел интерфейса A ... так что его переменная доступна для его подклассов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...