Цель-C: наследование защищенного / частного атомарного свойства - PullRequest
0 голосов
/ 14 апреля 2019

Скажем, у меня есть классы C, D, которые определены следующим образом:

@interface C:NSObject 
@end

@interface D:C 
@end

Моя цель - добавить атомарное свойство P к классу C таким образом, чтобы оно было видимым и использованным внутри класса D (и его производных) только .

Какой лучший способ сделать это?

PS Свойство ДОЛЖНО быть атомным в D.

Ответы [ 2 ]

3 голосов
/ 14 апреля 2019

В Objective-C нет прямой поддержки защищенных свойств или методов. Однако есть способ сделать это по соглашению. Как абстрактные методы - если кто-то хочет, он может легко нарушить это.

Вы определяете свойство, которое хотите защитить, в файле .m.

@interface DemoObject ()
    @property NSString *protectedString;
@end

@implementation DemoObject
    //implementation of the class
@end

Свойство атомное - по умолчанию.

Тогда вы наследуете от DemoObject:

.h файл

@interface InheritingObject : DemoObject

@end

.m файл

@interface DemoObject ()

    @property NSString *protectedString;

@end

@implementation InheritingObject
- (instancetype)init {
    if (self == [super init]) {
        self.protectedString = @"Some String";
    }

    return self;
}
@end

В основном здесь произошло то, что мы создали расширение DemoObject, которое предоставляет нам необходимое нам свойство InheritingObject. Любой объект, который использует DemoObject, не видит свойство protectedString, поскольку оно не определено в его файле .h. Классы, которые видят свойство, - это те, которые определяют расширение DemoObject.

На самом деле вы можете таким образом выставить свойство для любого класса, а не только производного. Так что это соглашение легко нарушить. Однако это создает какой-то порядок и иллюзию защищенной области.

0 голосов
/ 14 апреля 2019

Вы можете иметь это без повторений и, следовательно, гораздо проще обрабатывать:

Ch:

@interface C : NSObject
…
@end

Создать другой заголовочный файл:

C_Защищено:

@interface C()
@property id protecedVisibility;
@end

См

@import "C.h"
@import "C_Protected.h" // You have to do this for correct implementation

Дм:

#import "C.h"
#import "C_Protected.h"

Затем вы можете легко редактировать защищенную часть.

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