2011-12-23 155 views
0

我有一個類,其實例變量爲NSArray,我知道應該從同一個超類繼承不同的對象。我的問題是如何從另一個類(其控制器)訪問實例變量和方法,同時確保數組內容僅包含某個類的子類的對象?我嘗試實現一個最小協議,並將數組中的對象作爲id(id *)類型的對象進行響應,但不會讓我訪問數組中任何實例變量或類的方法(以及正確的方法)。 在對象文件訪問子類實例

NSArray* components; // contains subclasses of component 

在控制器文件

subclassofClassObject* object; 

是有subclassOf功能,宏的typedef ...等或一種解決方法,所以我可以在一個子類參考分量的子類對象來自控制器的子類。即要替換subclassofClass。

+1

你確定需要'id *'類型的變量嗎?這將是一個指向'id'的指針,它已經是一個指向Cocoa對象的指針了。 – Monolo

回答

0

我不太明白你問什麼,但也許下面將幫助:

您可以確定,如果你有一個類的實例,或者使用isKindOfClass:它的一個子類。例如,給定一個類MyBaseClass,然後使用演員表:

id elem = [components objectAtIndex:ix]; 
if ([elem isKindOfClass:[MyBaseClass class]]) 
{ 
    // elem is an instance of MyBaseClass or one of its subclasses so cast is safe 
    MyBaseClass *mbc = (MyBaseClass *)elem; 
    // now can access methods, properties and public instance variables 
    // of MyBaseClass via mbc without warnings 
    ... 
} 
+0

請遵守慣例,並用大寫字母(和小寫字母的方法名稱)開始課程名稱:-) – DarkDust

+0

Ahh ...施放。我忘了那個。 Yery很有幫助,謝謝。 – Nicholas

2

我建議先考慮一下您的架構設計。你可以嘗試在你的子類實現中移動你的邏輯:

@interface BaseClass: NSObject { 
} 
... 
- (void) doMySuperImportantStuff: (id)data; 
@end 

@implementation BaseClass 
... 
- (void) doMySuperImportantStuff: (id)data 
{ 
    // basic implementation here, or common actions for all subclasses 
    NSLog(@"BaseClass is here"); 
} 
@end 


@interface ClassA: BaseClass 
{ 
NSInteger i; 
} 
... 
@end 

@implementation ClassA 
... 
- (void) doMySuperImportantStuff: (id)data 
{ 
    // some specific stuff 
    NSLog(@"ClassA is here, i=%d", i); 
} 
@end 


@interface ClassB: BaseClass 
{ 
    NSString *myString; 
} 
... 
@end 

@implementation ClassB 
... 
- (void) doMySuperImportantStuff: (id)data 
{ 
    // another specific stuff 
    NSLog(@"ClassB is here, myString = %@", myString); 
} 
@end 

// client code example 
.... 
NSArray *list = ...; // list of instances of the subclasses from BaseClass 
for(BaseClass *item in list) { 
    [item doMySuperImportantStuff: userData]; 
}