Удобство создания подклассов

Если у меня есть суперкласс с удобным конструктором следующим образом (с использованием 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 пример.

Другие вопросы по тегам