我正在编写一个项目,出于开发目的,我想在运行时处获取某个对象的超类实例。 例如,如果我在名为 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;
是不正确的,因为玻璃不是一种类型。我需要一些东西来允许我在特定情况下使用“运行时生成的广播”来转换对象,因为我没有从一开始就知道对象的层次结构。
最重要的部分是:我知道“ super”存在,但是我需要创建一个新对象,删除对其子类的任何引用。这必须对具有至少两个超类的任何对象有效(因此,在我的情况下,我不应该将带有参数superSuperInstance的generateSuperclassInstanceOfObject方法使用,因为它具有NSObject作为超类)。
请帮忙吗?
答案 0 :(得分:1)
通常,您无法做您想做的事情。对象是特定类的实例,并且永远不会改变。
当将对一个类的对象的引用强制转换为对不同类的对象的引用时,无论如何引用对象都不会改变,那么改变就是编译器如何处理引用。
根据您的问题,您不清楚要达到的目的。如果您打算调用由于被覆盖而无法访问的方法,那么super
机制就可以实现。
如果此答案不能回答您的问题,您可以提出一个新问题,或编辑当前问题,详细说明您要做什么,您尝试过什么的目的 。有人可能会帮助您。 (即,请勿尝试在评论中扩展此问题。)
HTH
答案 1 :(得分:0)
将一个对象铸造为另一个对象根本不会更改基础对象。所以这不会改变任何东西。
id superObject = (klass *)object;
如果您想要超级对象的实例,则需要像其他任何对象一样分配/初始化它。
id superObject = [[klass alloc] init];
虽然不确定为什么要这么做...但这是您的答案。