【问题标题】:How to get superclass' instance of object如何获取超类的对象实例
【发布时间】: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


【解决方案1】:

一般来说,你不能做你想做的事。对象是特定类的一个实例,并且永远不会改变。

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

从您的问题来看,您希望这样做的目的尚不清楚。如果您的意图是调用由于被覆盖而无法访问的方法,那么super 机制就是为此目的而存在的。

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

HTH

【讨论】:

    【解决方案2】:

    将一个对象转换为另一个对象根本不会改变底层对象。所以这不会改变任何事情。

    id superObject = (klass *)object;

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

    id superObject = [[klass alloc] init];

    虽然不知道你为什么要这样做......但这就是你的答案。

    【讨论】:

      猜你喜欢
      • 2010-11-27
      • 2014-01-26
      • 2023-03-23
      • 2013-11-10
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 2015-08-19
      • 2011-01-28
      相关资源
      最近更新 更多