访问子类实例

时间:2011-12-23 07:58:32

标签: objective-c cocoa

我有一个Class,其实例变量为NSArray我知道应该从同一个超类继承的不同对象。我的问题是如何从另一个类(它的控制器)访问实例变量和方法,同时确保数组的内容只包含作为某个类的子类的对象?我尝试实现一个最小协议并将数组中的对象重新引用为类型id(id *),但这不允许我访问数组中类的任何实例变量或方法(这是正确的) 。 在目标文件

NSArray* components; // contains subclasses of component

在控制器文件中

subclassofClassObject* object; 

是否有一个subclassOf函数,宏,typedef ...等或变通方法,所以我可以从控制器的子类引用对象的子类中的组件的子类。即要替换subclassofClass的东西。

2 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分: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
   ...
}