2010-09-07 50 views
1

我正在将一个项目从C#移植到Objective-C,并且我想知道如何在Objective-C中实现一个内部类(内部含义仅在此项目内部可见)。内部类目标C

例如,我在C#代码:

public abstract class AbstractBaseClass : AInterface 
{ 
    // methods go here 
} 

internal class InternalSubclass : AbstractBaseClass 
{ 
    // methods go here 
} 

这是代码我迄今转换:

// AbstractBaseClass.h 
#import <Foundation/Foundation.h> 
#import "AInterface.h" 

@interface AbstractBaseClass : NSObject<AInterface> 

// methods go here 

@end 

// AbstractBaseClass.m 
#import "AbstractBaseClass.h" 

@implementation AbstractBaseClass 

-(void) abstractMethod 
{ 
     [NSException raise:@"abstract method" format:@"This method is abstract, and thus cannot be called"]; 
} 

// more methods 

@end 

我应该在哪里把InternalSubclasses的接口和实现?他们是否应该在一个名为InternalClasses.h/m的单独文件中?或者我应该只是没有这些文件的头文件,只需为它们提供一个.m文件。

任何帮助,将不胜感激!

回答

0

谢谢你所有的答案,我决定公开课,因为我现在是唯一一个使用这个库的人。我真的只是想知道在Objective C语言的文档中是否遗漏了关于内部类的东西,因为你可以将变量标记为@package

0

是的,真正拥有'内部'类的唯一方法是隐藏它们的标题。但即使如此,如果使用这些类,如果他们知道它的名字是微不足道的'NSClassFromString'我想说你可能想考虑重新设计它,而不是使用Obj-C不是真正的类设计风格为...而做。

不知道更多关于你在做什么,我不能建议一个不同的设计。

1

在Obj-C中没有相同的“内部”概念。正如Joshua所说,最好的做法是将“内部”子类的头文件保留为私有的,仅记录基类的接口。

就创建抽象基类而言,您的设计没有问题。苹果公司将这种设计用于“类集群”,在这种情况下,你并不是真的得到了一个例如NSStringNSImage,你得到的是具有相同接口的其他东西。

其他方式的OBJ-C来完成,这是通过一个正式的协议:

@protocol AbstractInterface 
- (void)method1; 
... 
@end 

然后,而不是绕过AbstractBaseClass * S,你绕过id<AbstractInterface>秒。如果您的基类具有零状态且没有默认实现,则它们是等效的。

要解决您的其他问题:每个类应该有它自己的.h和.m文件。无论这种特定的情况如何,这总是真的。

2

我通常这样做的方式是在基类的.m文件中声明内部类的接口和实现。

当然,如果类变大,您可能需要将它们分开以避免文件太大。如果你正在编写一个框架,有一种机制来指定哪些头文件被公开(即导出到框架的头文件目录),否则,你只需要求助于文档。