我有一个Class,其实例变量为NSArray
我知道应该从同一个超类继承的不同对象。我的问题是如何从另一个类(它的控制器)访问实例变量和方法,同时确保数组的内容只包含作为某个类的子类的对象?我尝试实现一个最小协议并将数组中的对象重新引用为类型id
和(id *)
,但这不允许我访问数组中类的任何实例变量或方法(这是正确的) 。
在目标文件
NSArray* components; // contains subclasses of component
在控制器文件中
subclassofClassObject* object;
是否有一个subclassOf函数,宏,typedef ...等或变通方法,所以我可以从控制器的子类引用对象的子类中的组件的子类。即要替换subclassofClass的东西。
答案 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
...
}