2014-12-10 5 views
2

У меня есть класс B, который наследуется от класса A. Я хочу объявить некоторые свойства в классе A и импортировать некоторые классы в него, однако я не хочу выставлять эти свойства или классы пользователю класса bЗакрытые свойства подкласса

простыми словами я хочу, чтобы найти способ, чтобы объявить свойства, которые могут быть использованы только им подкласс, а не те, что импортировать его подклассов

+0

невозможно. Вы можете делать частные объявления только с использованием классов extenstions, но к ним также можно получить доступ –

+1

Напротив, это возможно и хорошая практика. См. Мой ответ ниже. – tooluser

ответ

0

Это вполне возможно, и в самом деле хорошей практикой.

В A.h вы должны импортировать только то, что абсолютно необходимо, например заголовки, содержащие протоколы, которые вы должны придерживаться публично. Любые другие необходимые классы должны быть предварительно определены с помощью @class и @protocol. Объявите любые свойства, которые вы можете использовать только для чтения.

@class SomeObject 

@interface ClassA : NSObject 
@property (strong, nonatomic, readonly) NSString *id; 
@property (strong, nonatomic, readonly) SomeObject *object; 
@end 

В A.m вы должны импортировать любые заголовки, которые вам нужны конфиденциально. Кроме того, реализуйте расширение категории и переопределяйте любые свойства только для чтения как readwrite.

#import "SomeObject.h" 

@interface ClassA() 
@property (strong, nonatomic, readwrite) NSString *id; 
@property (strong, nonatomic, readwrite) SomeObject *object; 
@property (strong, nonatomic, readwrite) NSString *entirelyPrivate; 
@end 

@implementation A 
. . . . etc 

Если вы хотите, чтобы эти значения доступны для подкласса, но не к другим классам, вы можете поместить их в категории. Это делается несколькими классами в инфраструктуре Apple.

Например, создайте файл ClassA+Subclass.h и включают в себя:

@interface ClassA (SubclassOnly) 
@property (strong, nonatomic, readwrite) NSString *id; 
@end 

Тогда просто импортировать, что в реализации подкласса, который нуждается в «защищенный» доступ.

+1

Вы можете использовать ту же технику, но поместив ее в дополнительный файл, чтобы позволить подклассам доступ к закрытым значениям. Дайте мне знать, если вы хотите, чтобы я расширился. – tooluser

+0

Это не то, что пользователь спросил. Вы все еще подвергаете эти свойства чему-либо, что импортирует ClassA, а также свойства, которые подклассифицируют его. Ты только что сделал их только для чтения. 'Anoop Vaidya' правильный, это невозможно. – Popeye

+0

Если я неправильно понял, это неверно. Например, «allPrivate» NSString, как запросил пользователь, не подвергается классам подкласса «ClassA». Вышеприведенные примеры имеют как частично открытые, так и полностью частные свойства. Та же картина может быть продолжена, чтобы свойства или импорт были полностью частными, как хочет OP. – tooluser