Какая точка использования [self class]
Правильно ли этот код
@implementation Vehicle
+(id) vehicleWithColor:(NSColor*)color {
id newInstance = [[[self class] alloc] init]; // PERFECT, the class is // dynamically identified
[newInstance setColor:color];
return [newInstance autorelease];
}
@end
Зачем использовать [self class]
Я думал, что я уже указывает на класс на статические методы (те, у которых +)
Ответы
Ответ 1
Вы правы: [self class]
не нужен в методе класса (его чаще называют в Objective-C, а не в методе static), потому что self
уже является классом, а [self class]
возвращает себя.
Но это становится немного интереснее. В Objective-C объекты класса являются технически экземплярами метаклассов. Поэтому [self class]
в методе класса должен возвращать метакласс вместо самого класса. Но для практических целей Objective-C скрывает метакласс, поэтому он специально обрабатывает этот случай.
Некоторые хорошие чтения по этой теме:
Ответ 2
Он поддерживает подклассы. Если вы жестко закодировали имя класса, как в [[Vehicle alloc] init]
, тогда подкласс транспортного средства должен будет переопределить + vehicleWithColor: чтобы он делал правильные действия. С помощью [self class]
вы можете создать подкласс HarleyDavidson, а [HarleyDavidson vehicleWithColor:[NSColor blackColor]]
выполнит правильную работу автоматически, создав экземпляр HarleyDavidson вместо экземпляра Vehicle.
( Edit:)
См. комментарий Джо ниже self
vs. [self class]
в методах класса. В методах класса это не имеет значения. Но есть такая ситуация, когда это возможно. Классы могут отвечать на методы экземпляров, которые определены в корневом классе - сам по себе -class
- это именно такой метод, определенный как метод экземпляра в протоколе NSObject. Поэтому, если вы расширите класс корня, например NSObject, добавив метод экземпляра, этот метод всегда должен использовать [self class]
, если ему нужно ссылаться на свой собственный объект класса.