如何获得对象的超类实例

时间:2018-10-07 18:54:20

标签: objective-c

我正在编写一个项目,出于开发目的,我想在运行时处获取某个对象的超类实例。 例如,如果我在名为 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作为超类)。

请帮忙吗?

2 个答案:

答案 0 :(得分:1)

通常,您无法做您想做的事情。对象是特定类的实例,并且永远不会改变。

当将对一个类的对象的引用强制转换为对不同类的对象的引用时,无论如何引用对象都不会改变,那么改变就是编译器如何处理引用。

根据您的问题,您不清楚要达到的目的。如果您打算调用由于被覆盖而无法访问的方法,那么super机制就可以实现。

如果此答案不能回答您的问题,您可以提出一个新问题,或编辑当前问题,详细说明您要做什么,您尝试过什么的目的 。有人可能会帮助您。 (即,请勿尝试在评论中扩展此问题。)

HTH

答案 1 :(得分:0)

将一个对象铸造为另一个对象根本不会更改基础对象。所以这不会改变任何东西。

id superObject = (klass *)object;

如果您想要超级对象的实例,则需要像其他任何对象一样分配/初始化它。

id superObject = [[klass alloc] init];

虽然不确定为什么要这么做...但这是您的答案。