【问题标题】:Convert object type to subclassed object type in Objective-C在 Objective-C 中将对象类型转换为子类对象类型
【发布时间】:2010-02-13 08:01:06
【问题描述】:

假设我有 A 类和 B 类。B 类是 A 类的子类。A 类包含一些属性,然后 B 类通过添加一些特定于该子类的附加属性来扩展 A 类超类。我已经创建了一个 A 类对象,现在希望在运行时将该对象转换为 B 类类型对象,这样我就可以将数据添加到 B 类提供的附加属性中。在 Objective-C 中有什么方法可以做到这一点?谢谢!

【问题讨论】:

  • 这很危险;你真的不应该这样做。

标签: objective-c subclass dynamic-typing


【解决方案1】:

你为什么不为 Class B 编写一个构造函数,它接受 Class A 作为参数以及 Class B 所需的附加属性。

为什么不首先创建一个 B 类?你想要这样做听起来有点奇怪。也许你可以给我们一些关于 A 类和 B 类的更具体的细节,以及你正在用它们做什么。

【讨论】:

  • 这个成语的一个例子是[NSMutableArray arrayWithArray:someArray]
【解决方案2】:

您无法就地转换它,因为 B 类的实例大于 A 类的实例(假设附加属性存储在 ivars 中)。 Objective-C 没有重新定位对象的能力。

如果您乐于制作对象的副本(即,您确定没有对它的引用或可以更新它们),您可以使用 Objective-C runtime functions 执行类似的操作:

newB = object_copy(a, class_getInstanceSize(B));
object_setClass(newB, B);
object_dispose(a);

【讨论】:

  • 当心,如果有任何东西引用了 a,那么该引用现在将是无效的。
【解决方案3】:

最简单的方法是将A类上的alloc替换为实际返回B类。

@implementation ClassA (MyCategory)

+ (id)alloc
{
    if (self != [ClassB class])
        return [ClassB alloc];
    return [super alloc];
}

@end

当然,这样做通常是一个非常糟糕的主意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多