Преобразовать тип объекта в тип подкласса объекта в Objective-C - PullRequest
2 голосов
/ 13 февраля 2010

Скажите, что у меня есть класс A и класс B. Класс B является подклассом класса A. Класс A содержит некоторые свойства, а затем класс B расширяет суперкласс класса A, добавляя некоторые дополнительные свойства, специфичные для этого подкласса. Я создал объект класса A и теперь хочу преобразовать объект в объект типа Class B во время выполнения, чтобы я мог добавить данные к дополнительным свойствам, предоставляемым классом B. Есть ли способ сделать это в Objective-C ? Спасибо!

Ответы [ 3 ]

3 голосов
/ 13 февраля 2010

Почему бы вам не написать конструктор для класса B, который принимает класс A в качестве аргумента с дополнительными свойствами, необходимыми для класса B.

Почему бы вам просто не создать класс B? Это звучит немного странно, что вы хотите сделать это. Возможно, вы можете дать нам более конкретные сведения о классах A и B и о том, что вы делаете с ними.

1 голос
/ 13 февраля 2010

Вы не можете преобразовать его на месте, потому что экземпляр класса B больше, чем экземпляр класса A (при условии, что дополнительные свойства хранятся в ivars). Objective-C не имеет возможности перемещать объекты.

Если вы счастливы сделать копию объекта (т.е. уверены, что на него нет ссылок или можете обновить его), вы можете сделать что-то подобное с функциями времени выполнения Objective-C

newB = object_copy(a, class_getInstanceSize(B));
object_setClass(newB, B);
object_dispose(a);
0 голосов
/ 13 февраля 2010

Самым простым способом является замена alloc в классе A для фактического возврата класса B.

@implementation ClassA (MyCategory)

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

@end

Конечно, это вообще плохая идея.

...