2011-10-07 59 views
29

我想了嵌套私有类的模式在Objective C.私人课程目标C

的要求是:

  • 类将不可见/访问其他类。
  • 类可以执行方法(即,不C结构)
  • 含有类成员可见/访问嵌套类

考虑的意见,我简化了要求:

  • 内部类可以被其他类访问,但不可见(类似于使用类别来隐藏私有方法)。
  • 内部类不必嵌套

这还算是不可能的?

+0

'class'怎么样? – Dani

+1

对不起,您要求的内容在Obj-C中不存在。 –

+0

@Kevin Ballard:它存在于Obj-C++ – Dani

回答

84

Objective-C没有使用私有类或私有实例变量的形式以正式的声明方式。

相反,Objective-C中的可见性完全由您声明某些内容的位置控制。如果它在一个头文件中,它可以通过别的东西导入。如果它是在实现文件中声明的,它不能(合理地)被导入,因此对于该编译单元是有效的私有的。

而“它”,我的意思几乎任何可以声明的东西;类,全球等...

即,如果您在.m文件中为某个类添加@interface/@implementation对,则该类对于该编译单元来说实际上是私有的。当然,如果没有名称空间,请确保该类是唯一命名的。


考虑一下:

了foo.h:

@interface Foo: NSObject 
... public interface 
@end 

Foo.m:

@interface __FooSupportClass: NSObject 
... interface here ... 
@end 

@implementation __FooSupportClass 
@end 

@interface Foo() 
@property(retain) __FooSupportClass *__fooSupport; 
@end 

@implementation Foo 
@synthesize __fooSupport = fooSupport__; 
... etc ... 
@end 

这就给了你一个私人的可视性支持类只可用你的实现有一个实例变量和你的类上的setter/getter方法,这些方法在编译之外是不可见的单位。

(需要注意的是Objective-C中有“实例变量”,而不是“成员变量”,它们是相似的,但你会使用语言的词汇会更好。)

+0

这是我原来的做法。但是,我需要该内部类的一个实例成为成员。我怎样才能做到这一点?一个前向@class声明会有诀窍吗? – Ovesh

+0

好吧,我刚刚检查过它。好的,那就是我要去的方法。当然,内部阶层不能访问的含有集体成员的问题依然存在。 – Ovesh

+0

如何从fooSupport访问foo变量?可能吗? – Sakthimuthiah