Цель C Инкапсуляция - PullRequest
       1

Цель C Инкапсуляция

2 голосов
/ 14 августа 2010

Я объясню свой вопрос на примере.

В .H файле //

@interface Employee:NSObject{

@private

NSString *name;

}

@property(nonatomic,retain) NSString *name;

в .M файле //

@implementation{

@synthesize name;

}

В этомСценарий, когда я получаю доступ к свойству name в другом классе, например myEmp.Name = @"John";, не вызывает никаких проблем.Это соответствует правилам инкапсуляции или я неправильно понимаю?

Ответы [ 3 ]

7 голосов
/ 14 августа 2010

Вы не нарушили правила инкапсуляции, потому что @property(nonatomic,retain) NSString *name; уже указывает, что вы хотите выставить методы получения / установки для name.

Инкапсуляция нарушается только при прямом доступе к ivar, т.е.

myEmp->name = @"John";  // wrong
5 голосов
/ 14 августа 2010

Я думаю, вы неправильно поняли, для чего предназначены @property и @synthesize. Это удобные способы определения методов доступа. то есть. то, что у вас есть, эквивалентно: -

- (NSString *)name;
- (void)setName:(NSString *)value;

myEmp.name = @"John" является синтаксическим сахаром для [myEmp setName:@"John"]

Таким образом, вы явно создали дополнительные общедоступные методы доступа, а затем использовали их. Здесь не нарушена инкапсуляция.

2 голосов
/ 14 августа 2010

В Objective-C только метод экземпляра объекта может обращаться к переменной экземпляра.Для внешнего объекта не существует способа прямого доступа к переменным экземпляра объекта.@private относится только к наследованию.

Чтобы сделать переменные доступными, есть свойства.Свойство определяет метод, а все методы в Objective-C общедоступны.В Objective-C нет никакого способа определить частные методы, вы можете только «спрятать» их, объявив их где-то, кроме публичного файла .h (например, внутри файла .m через @interface Employee(), который объявляет анонимный раздел).

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