2011-12-23 4 views
0

У меня есть класс с переменной экземпляра NSArray различных объектов, которые, как я знаю, должны наследоваться от одного и того же суперкласса. Мой вопрос: как мне получить доступ к переменным экземпляра и методам из другого класса (его контроллера), гарантируя, что содержимое массива содержит только объекты, которые являются подклассом определенного класса? Я попытался реализовать минимальный протокол и восстановить объекты в массиве типа id и (id *), но это не позволит мне получить доступ к каким-либо переменным экземпляра или методам классов в массиве (и это правильно). В файле объектаДоступ к экземплярам подкласса

NSArray* components; // contains subclasses of component 

В файле контроллера

subclassofClassObject* object; 

есть ли subclassOf функция, макро, ЬурейеЕ ... и т.д. или обходной путь, так что я может ссылаться на подклассы компонента в подклассе объект из подкласса контроллера. то есть заменить подкласс класса.

+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 ... Casting. Я забыл об этом. Привет, спасибо. – 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]; 
} 
Смежные вопросы