Цель-C: создать объект того же класса, что и сам - PullRequest
0 голосов
/ 20 марта 2011

У меня есть два класса: Альфа и Бета.

Бета-версия наследуется от Alpha.

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

Например:

- (Alpha *)makeAnother {
  return [[[self class] alloc] init] autorelease];
}

Я думал, что это будет работать, но это не так.

Ответы [ 4 ]

2 голосов
/ 20 марта 2011

Измените тип возврата с Alpha* на id в этом случае.В остальном это правильно.

0 голосов
/ 20 марта 2011
- (Alpha *)makeAnother {
  return [[[self class] alloc] init] autorelease];
}

Этот код отлично работает.Без определения того, что «не работает» означает для вас, трудно сказать больше.

Однако вы должны определить метод как возвращающий (id), если вы когда-нибудь ожидаете, что такой шаблон будет работатьбез приведения:

Beta* b = [someObjectIKnowIsBeta makeAnother];

Objective-C не поддерживает совместную / противоположную дисперсию, и поэтому любой метод, который, как ожидается, будет возвращать экземпляры разных классов, объявляется как возвращающий (id), чтобы избежать приведения.Это распространено в рамках.См. -dataCell, +array, +alloc и т. Д.

0 голосов
/ 20 марта 2011

Самый простой способ - написать свою альфа-функцию:

- (Alpha *)makeAnother {
   return [[[Alpha alloc] init] autorelease];
}

, а затем переписать эту функцию в своем бета-классе:

- (Alpha *)makeAnother {
   return (Alpha*)[[[Beta alloc] init] autorelease];
}
0 голосов
/ 20 марта 2011

Не уверен, что вы пытаетесь сделать здесь, когда вы используете полиморфизм, конечная цель состоит в том, чтобы создать надлежащий подкласс Beta, и он наследует все методы суперкласса Alpha. Если вы хотите вернуть объект типа Beta, вы должны объявить его в классе Beta.

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

@Class Beta;

Было бы полезно, если бы вы попытались точно описать, что вы пытаетесь сделать со своим кодом.

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