2010-09-07 54 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文件中聲明內部類的接口和實現。

當然,如果類變大,您可能需要將它們分開以避免文件太大。如果你正在編寫一個框架,有一種機制來指定哪些頭文件被公開(即導出到框架的頭文件目錄),否則,你只需要求助於文檔。