Как получить экземпляр объекта суперкласса - PullRequest
0 голосов
/ 07 октября 2018

Я пишу проект, и я хотел бы получить экземпляр суперкласса определенного объекта в время выполнения для целей разработки.Например, если у меня есть этот метод в классе с именем 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 *) объект;

неверен, потому что klass не является типом. Мне нужно что-то, что позволяет мне приводить объект в этомособая ситуация, использующая «приведение, генерируемое во время выполнения», потому что я не знаю с самого начала иерархию объекта.

Самая важная часть заключается в следующем: я знаю, что «супер» существует, но мне нужно создать новый объект, удалив любую ссылку на его подкласс .Это должно быть допустимо для любого объекта, имеющего по крайней мере 2 суперкласса (поэтому в моем случае я не должен иметь возможность использовать метод generateSuperclassInstanceOfObject с аргументом superSuperInstance, поскольку он имеет NSObject в качестве суперкласса).

Любая помощь, пожалуйста

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Приведение одного объекта к другому вообще не меняет базовый объект.Так что это ничего не меняет.

id superObject = (klass *)object;

Если вы хотите экземпляр суперобъекта, вам нужно выделить / инициализировать его как любой другой объект.

id superObject = [[klass alloc] init];

Не знаю, почему вы хотите это сделать, хотя ... но это ваш ответ.

0 голосов
/ 07 октября 2018

В общем, вы не можете делать то, что пытаетесь сделать.Объект является экземпляром определенного класса и никогда не изменяется.

Когда ссылка на объект одного класса приводится к ссылке на объект другого класса, ссылочный объект в любом случае не изменяетсячто меняет то, как компилятор обрабатывает ссылку.

Из вашего вопроса не ясно, с какой целью вы хотите это сделать.Если вы намереваетесь вызывать методы, недоступные из-за их переопределения, то для этой цели существует механизм super.

Если этот ответ не отвечает на ваш вопрос, вы можете задать новый вопрос или отредактироватьтекущий, с подробным описанием цели того, что вы пытаетесь сделать, что вы пытались и т. д., и кто-то, вероятно, поможет вам в этом.(Т.е. не пытайтесь расширить этот вопрос в комментариях.)

HTH

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...