【发布时间】:2018-10-07 18:54:20
【问题描述】:
我正在编写一个项目,我想在运行时获取某个对象的超类实例,以用于开发目的。 例如,如果我在一个名为 SomeClass 的类中有这个方法:
+(id)generateSuperclassInstanceOfObject:(id)object {
if (object) {
NSLog(@"The class of the object is %@", [object class])
Class klass = [object superclass];
if (!klass)
NSLog(@"Klass not available");
else {
//NSLog(@"The superclass of the object is %@", NSStringFromClass(klass));
id superObject = (klass *)object;
//NSLog(@"Correctly generated the superclass instance!");
return superObject;
}
}
return NULL;
}
如果我有:
@interface A : NSObject
...
@end
@interface B : A
...
@end
@interface C : B
...
@end
如果它至少有 2 个超类(如我的情况),我想做类似的事情:
C *object = [[C alloc] init];
id superInstance = [SomeClass generateSuperclassInstanceOfObject:object];
NSLog(@"Generated correct superInstance of class: %@", [superInstance class]);
id superSuperInstance = [SomeClass generateSuperclassInstanceOfObject:superInstance];
NSLog(@"Generated correct superInstance of class: %@", [superSuperInstance class]);
NSLog 打印的地方:
The class of the object is C
Generated correct superInstance of class: B
The class of the object is B
Generated correct superInstance of class: A
在我的代码中,它看起来
id superObject = (klass *)object;
不正确,因为 klass 不是一种类型。我需要一些允许我在这种特殊情况下使用“运行时生成的转换”来转换对象的东西,因为我不从一开始就知道对象的层次结构。
最重要的部分是:我知道“超级”存在,但我需要创建一个新对象,删除对其子类的任何引用。这对于任何具有至少 2 个超类的对象都必须有效(因此在我的情况下,我不应该使用带有参数 superSuperInstance 的 generateSuperclassInstanceOfObject 方法,因为它具有 NSObject 作为超类)。
有什么帮助吗?
【问题讨论】:
-
您的问题有点难以理解。您可以将对象强制转换为其父对象的实例,但这不会改变它的本质,只是改变它的外观。可以获取一个未知对象,并通过许多运行时技巧推断它是超级类型并创建一个。但它是一个新对象。不是对象。你需要真正知道你在做什么才能尝试它。也许如果您告诉我们您想要达到的目标以及原因,那么我们可以更好地了解问题所在。
标签: objective-c