Это может быть глупый вопрос, но здесь все равно. В объекте c, в методе инициации дочернего класса часто задается self = [super init]. Теперь я имеет дочерний класс, и преобразование не требуется, что означает (или нет ..), что метод init родительского класса каким-то образом возвращает объект, который действительно принадлежит дочернему классу.Метод/свойство в родительском классе, возвращающем объект из дочернего класса
Итак, мой вопрос: могу ли я определить другие методы или свойства в родительском классе, который при вызове из дочернего класса возвращает объект из дочернего класса? Существует что-то подобное в Java называется фабричные методы, я думаю, так что, возможно, этот вопрос не слишком возмутительно ..
Edit 1. Позвольте мне лучше объяснить, что я имею в виду: я знаю, что я могу узнать в методе ParentClass , что я фактически работаю над объектом из класса ChildClass. Это, глядя на [self class]. Тем не менее, я хотел бы объявить метод в ParentClass, что возвращает объект из дочернего класса, не зная, какой класс будет дочерним. Еще лучше, я хочу, чтобы возвращаемый объект даже не нуждался в формальном преобразовании.
Например, я хочу метод в родительском классе, что делает что-то вроде следующего:
-(ChildClass *) partialCopyOfSelf {
//returns an object which is a partial copy of self (only copying properties that also
// exist in parent class, but such that applying [result class] will yield the child class
// and will require no further conversion
(ChildClass *) copy=[[ChildClass alloc] init];
//now copy stuff
return copy;
}
Сейчас в дочернем классе, я хочу, чтобы быть в состоянии осуществить что-то из следующего рода:
-(MyClass *) copyOfSelf {
MyClass *copy=[super partialCopyOfSelf];
// now copy properties that only exist in my child class
return copy;
}
Редактировать 2 (из комментария, который я написал в @wbyoung). Причина, по которой я хочу, это то, что в какой-то момент я могу изменить свойства родительского класса из ivars, возможно, просто вычислив некоторые значения, например, чтобы ребенок не знал, как правильно их скопировать. Я пишу это, потому что у кого-то есть лучшее представление о том, как выполнить ту же задачу.
см. Мое редактирование и мой комментарий для ответа @ Jenox – user1258240
Re: ваше редактирование. Это просто похоже на плохую идею. Вы можете вызвать '[[[self class] alloc] init]', чтобы сделать копию (или даже пропустить 'init'), после чего оценивая значения по мере необходимости, но использование частичной копии похоже на то, что у вас возникнут проблемы. – wbyoung
Да, я думаю, я мог бы это сделать, спасибо! Что касается беды - я чувствую себя достаточно предприимчивым, чтобы попробовать в любом случае, но был бы рад, если бы вы могли указать сценарий, когда этот подход был бы хлопотным. Причина, по которой я хочу, это то, что в какой-то момент я могу изменить свойства родительского класса из ivars, возможно, просто вычислив некоторые значения, например, чтобы ребенок не знал, как правильно их копировать. – user1258240