2012-02-11 3 views
1

Если у меня есть супер класс с конструктором удобства следующим образом (с использованием ARC):подклассов удобство construtctor

+(id)classA { 
    ClassA *foo = [[ClassA alloc] init]; 

    return foo; 
} 

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

+(id)classB { 
    ClassB *foo = [ClassA classA]; 

    return foo; 
} 


(Предположим, что я не могу назвать Alloc и инициализации на ClassB).

Спасибо!

ответ

2

Нет, это неправильно, поскольку это выделяет, inits и возвращает ClassA, а не ClassB. Единственный способ сделать это, чтобы не использовать CLASSA явно:

+ (id) classA 
{ 
    return [[self alloc] init]; 
} 

Конечно, вы можете также использовать старомодный new для этого:

ClassB *myB = [ClassB new]; 

FWIW, при условии, что я хотел бы сделать больше чем просто выделить и первонач, и мой класс называется гаджет, то я хотел бы сделать что-то вроде:

+ (id) gadgetWithNumber: (int) num 
{ 
    return [[self alloc] initWithNumber: num]; 
    // or without ARC: 
    // return [[[self alloc] initWithNumber: num] autorelease]; 
} 

конечно, предполагающей, что существует initWithNumber: метод в моем классе.

+0

Как вы относитесь к подклассу UIButton. Я вижу много подклассов для людей, а в конструкторе они делают что-то вроде MyBtnClass * myBtn = [MyBtnClass buttonWithType: UIButtonTypeCustom] ' –

+0

OK, Objective-C вернет правильный тип, если вы вызываете такой« конструктор »на UIButton. Но это работает по-другому. См. Мое редактирование. –

+0

@RudyVelthuis - хорошие правки ;-) «старомодный»? – CRD

3

Метод класса передается self точно так же, как метод экземпляра, только в случае метода класса значение self является экземпляром Class. Таким образом изменить метод classA к:..

+ (id) classA 
{ 
    return [[self alloc] init]; 
} 

(который является только определение new вы унаследовали от NSObject Конвенция является newX возвращает сохраняются ссылки, в то время как classnameX возвращает autoreleased ссылку с помощью ARC разница действительно спорный вопрос , но я бы с newX себя.)

Теперь, если ClassB является подклассом ClassA тогда [ClassB classA] будет вызывать classA с self быть ClassB и вы alloc и init a ClassB экземпляр.

 Смежные вопросы

  • Нет связанных вопросов^_^