Удобство создания подклассов
Если у меня есть суперкласс с удобным конструктором следующим образом (с использованием ARC):
+(id)classA {
ClassA *foo = [[ClassA alloc] init];
return foo;
}
Если я затем подкласс ClassA, с классом с именем ClassB, и я хочу переопределить конструктор удобства, следующее правильно:
+(id)classB {
ClassB *foo = [ClassA classA];
return foo;
}
(Предположим, что я не могу вызвать alloc и init для ClassB).
Спасибо!
2 ответа
Нет, это не правильно, так как это выделяет, инициирует и возвращает ClassA, а не ClassB. Единственный способ сделать это - не использовать ClassA явно:
+ (id) classA
{
return [[self alloc] init];
}
Конечно, вы также можете использовать старомодный new
за это:
ClassB *myB = [ClassB new];
FWIW, если я захочу сделать больше, чем просто выделить и инициализировать, а мой класс называется Gadget, тогда я сделаю что-то вроде:
+ (id) gadgetWithNumber: (int) num
{
return [[self alloc] initWithNumber: num];
// or without ARC:
// return [[[self alloc] initWithNumber: num] autorelease];
}
Конечно, это предполагает, что есть initWithNumber:
метод в моем классе.
Метод класса передан self
так же, как метод экземпляра, только в случае метода класса значение self
это пример Class
, Так что поменяй classA
метод для:
+ (id) classA
{
return [[self alloc] init];
}
(Что является только определением new
ты наследуешь от NSObject
, Конвенция newX
возвращает сохраненную ссылку, а classnameX
возвращает автоматически выпущенную ссылку. При использовании ARC разница действительно спорная, но я бы пошел с newX
себя.)
Сейчас если ClassB
это подкласс ClassA
затем [ClassB classA]
вызовет classA
с self
являющийся ClassB
и ты будешь alloc
а также init
ClassB
пример.